home *** CD-ROM | disk | FTP | other *** search
/ Grand Slam 3 / Grand Slam 3.iso / 023 / soundss3.arj / SB16MOD.ASM < prev    next >
Assembly Source File  |  1995-02-11  |  91KB  |  3,608 lines

  1. ;
  2. ;       ╔════════════════════════════════════════════╗
  3. ;       ║                                            ║
  4. TITLE   ║ SOUNDBLASTER 16 MODPLAYER  (SB 16 & COMP.) ║
  5. ;       ║                                            ║
  6. ;       ╚════════════════════════════════════════════╝
  7. ;
  8. ; THIS MODULE PLAYER WAS CODED IN EARLY 1995
  9. ;
  10. ;                        BY SILVIO TURELLO (FRONTMAN/CREW242)
  11. ;
  12. ; PC-CONVERSION OF AMIGA PROTRACKER CODE (FOR SUPER PRO PLAY > MODLIB)
  13. ;
  14. ;                        BY JOSHUA C. JENSEN (CYBERSTRIKE/FORM. RENAISSANCE)
  15. ;
  16. ; ORIGIN SOURCE CODE CAME FROM THE PROTRACKER V2.1A
  17. ;
  18. ;                        BY LARS "ZAP" HAMRE (AMIGA FREELANCERS)
  19. ;
  20. ; FEATURES: 4/8-CHANNEL-MODS (M.K./FLT4/FLT8/8CHN), 8-FX-CHANNELS (PC/AMIGA)
  21. ;
  22. ;           8/16 BIT, 10000-44100 HZ, STEREO PANNING E8x, 16 BIT INTERPOLATION
  23. ;
  24. ;           AMPLIFIED MIXING, FULL MOD-FX SUPPORT EXCEPT FILTER & REVERSE FUNK
  25. ;
  26. ;           592 KB EMS-MEMORY SUPPORT FOR FX, EMS BUFFERED TRACKTABLE
  27. ;
  28. ;           THIS ROUTINE NEEDS A REALLY FAST CPU TO HANDLE 16 CHANNELS!
  29. ;
  30. ; MEMORY:   11K CODE, 32K MIXBUF, 32K VOLTABLE, 0-???K SAMPLES
  31. ;
  32. .ALPHA
  33. .MODEL MEDIUM
  34. COM_OR_OBJ    = 0
  35. STACKLENGTH     = 0100H
  36. UGROUP2 GROUP CODE_SEG2, DATA_SEG2
  37. ASSUME CS:UGROUP2, DS:UGROUP2, SS:UGROUP2
  38. ;=============================================================================
  39. MAX_CHAN_NUMB    = 8
  40. FX_CHAN_NUMB    = 8
  41. IRQ1            = 20H
  42. IRQ2        = 21H
  43. IRQ3        =0A0H
  44. IRQ4        =0A1H
  45. TIMER0        = 40H
  46. PIT1            = 43H
  47. UHR_INDEX    = 70H
  48. UHR_PORT    = 71H
  49. UHR_STATA    = 0AH
  50. UHR_STATB    = 0BH
  51. UHR_STATC    = 0CH
  52. ;-----------------------------------------------------------------------------
  53. DATA_SEG2 SEGMENT WORD USE16
  54. PROG_START_SEG  DW 0
  55. PROG_END_SEG    DW 0
  56. IF COM_OR_OBJ
  57. VAR_BUFSEG    DW 0
  58. ELSE
  59. VAR_BUFSEG    DW 8000H
  60. ENDIF
  61. SYSTEM        DB 0
  62. IRQCOUNT    DB 56
  63. SB_MODUS    DB 0        ;0=MUSIC&FX, 1=MUSIC, 2=FX, 3=NO_SOUND
  64. CD_MIXER    DB 0        ;0=MODULES ONLY, 1=CD MIXED
  65. IRQ_REENTER    DW 0
  66. LOADMOD_FLAG    DB 0
  67. PAN_FX        DB 0        ;FLIP SAMPLE CHANNEL
  68. SAM_FLAG1    DB 0
  69. SAM_CH        DB 0
  70. SAMPLE_RATE    DW 22222
  71. SBP_MIXERI    DW 0224H
  72. SBP_MIXERD    DW 0225H
  73. SB_RESET    DW 0226H
  74. SB_READ        DW 022AH
  75. SB_WRITE    DW 022CH
  76. SB_RSTAT    DW 022EH
  77. IRQ_NUMBER    DB 7
  78. DMA_CHANNEL    DB 1
  79. DMA_POFF    DW 0
  80. MAINFREQ    DD 0
  81. DMA_CX        DW 0
  82. DMA_MORE    DW 0
  83. DMA_MAX        DW 0
  84. DMA_NEWPTR    DW 0
  85. DMA_PTR        DW 0
  86. DMA_SEG        DW 0
  87. DMA_OFFSET    DW 0
  88. MIXMUL_OFFSET    DW 0
  89. COMP_SPEED2     DW 0106H
  90. COMP_SPEED3     DW 4006H
  91. COMP_SPEED4     DW 0
  92. COMP_SPEED5     DW 1165
  93. HOLD70  LABEL   DWORD
  94.         DW OFFSET TIMER_HANDLER, 0
  95. HOLDSB  LABEL   DWORD
  96.         DW OFFSET SBIRQ_HANDLER, 0
  97. PAN_REGS    DB 3,12,12,3,3,12,12,3
  98. PANNINGL    DW 256,256,256,256,248,240,232,224,208,192,176,160,128,096,064,032
  99. PANNINGR    DW 032,064,096,128,160,176,192,208,224,232,240,248,256,256,256,256
  100. DMA_ADR        DB 0,2,4,6,0C0H,0C4H,0C8H,0CCH
  101. DMA_CNT        DB 1,3,5,7,0C2H,0C6H,0CAH,0CEH
  102. DMA_PAGE    DB 87H,83H,81H,82H,8FH,8BH,89H,8AH
  103. DMA_MASK    DB 0AH,0AH,0AH,0AH,0D4H,0D4H,0D4H,0D4H
  104. DMA_MOD        DB 0BH,0BH,0BH,0BH,0D6H,0D6H,0D6H,0D6H
  105. DMA_FLIP    DB 0CH,0CH,0CH,0CH,0D8H,0D8H,0D8H,0D8H
  106. ;-----------------------------------------------------------------------------
  107. GDDLENGTH    DD 0
  108. GDDREST        DW 0
  109. GDDHANDLE    DW 0
  110. GDDZEIG        DB 0
  111. SONG_START    DB 0
  112. ;-----------------------------------------------------------------------------
  113. ERROR1_TEXT    DB "MOD ERROR",13,10,"$"
  114. ERROR2_TEXT    DB "FX ERROR",13,10,"$"
  115. ERROR3_TEXT    DB "SB ERROR",13,10,"$"
  116. OUT_TEXT    DB "+/- VOLUME",13,10
  117.         DB "1   PLAY SAMPLE",13,10
  118.         DB "9   INIT REPEAT",13,10
  119.         DB "0   MUSIC MODE",13,10,"$"
  120. SAMPLE_NAME    DB "SAMPLE1.SAM",0
  121. CONFIG_NAME     DB "SS3.CFG",0
  122. CFG_TEXT2       DB "DEFAULT MUSIC MODE = ",0
  123. CFG_TEXT3       DB "SOUNDCARD BASE PORT = ",0
  124. CFG_TEXT4       DB "SOUNDCARD IRQ NUMBER = ",0
  125. CFG_TEXT5       DB "SOUNDCARD DMA NUMBER = ",0
  126. CFG_TEXT6       DB "DEFAULT SAMPLINGRATE = ",0
  127. CFG_TEXT7       DB "SYSTEM COMPATIBILITY = ",0
  128. ;-----------------------------------------------------------------------------
  129. ; PLAYER - KONTROLLSTRUKTUREN
  130. ;-----------------------------------------------------------------------------
  131. ALIGN 2
  132. MUSIC_VOL    DB 255
  133. MUSIC_VOLUME    DB 255
  134. FX_VOL        DB 255
  135. FX_VOLUME    DB 255
  136. MASTER_VOLUME    DB 255
  137. MOD_STAT    DB 0
  138. BPM_RATE    DW 1024
  139. BPM_VALUE    DW 125
  140. BPM_COUNT    DD 0
  141. BPM_SPEED    DD 0
  142. CH_NUMB        DW 4
  143. QUEUE_BUFFER    LABEL    WORD        ;256 BYTES
  144. NOTE        DW MAX_CHAN_NUMB DUP(0)
  145. CMD        DB MAX_CHAN_NUMB DUP(0)
  146. CMDLO        DB MAX_CHAN_NUMB DUP(0)
  147. START        DW MAX_CHAN_NUMB DUP(0)
  148. LENGTHI        DW MAX_CHAN_NUMB DUP(0)
  149. LOOPSTART    DW MAX_CHAN_NUMB DUP(0)
  150. REPLEN        DW MAX_CHAN_NUMB DUP(0)
  151. PERIOD        DW MAX_CHAN_NUMB DUP(0)
  152. FINETUNE    DB MAX_CHAN_NUMB DUP(0)
  153. VOLUME        DB MAX_CHAN_NUMB DUP(0)
  154. TONEPORTDIREC    DB MAX_CHAN_NUMB DUP(1)
  155. TONEPORTSPEED    DB MAX_CHAN_NUMB DUP(0)
  156. WANTEDPERIOD    DW MAX_CHAN_NUMB DUP(0)
  157. VIBRATOCMD    DB MAX_CHAN_NUMB DUP(0)
  158. VIBRATOPOS    DB MAX_CHAN_NUMB DUP(0)
  159. TREMOLOCMD    DB MAX_CHAN_NUMB DUP(0)
  160. TREMOLOPOS    DB MAX_CHAN_NUMB DUP(0)
  161. WAVECONTROL    DB MAX_CHAN_NUMB DUP(0)
  162. GLISSFUNK    DB MAX_CHAN_NUMB DUP(0)
  163. SAMPLEOFFSET    DB MAX_CHAN_NUMB DUP(0)
  164. PATTPOS        DB MAX_CHAN_NUMB DUP(0)
  165. LOOPCOUNT    DB MAX_CHAN_NUMB DUP(0)
  166.  
  167. MPANNING    DB MAX_CHAN_NUMB DUP(0)
  168. MFREQ        DW MAX_CHAN_NUMB DUP(0)
  169. MFIXED        DW MAX_CHAN_NUMB DUP(0)
  170. MOFLOW        DW MAX_CHAN_NUMB DUP(0)
  171. SONG_DATA    LABEL    BYTE        ;128 BYTES
  172. MVOL        DB MAX_CHAN_NUMB DUP(0)
  173. MSEG        DW MAX_CHAN_NUMB DUP(0)
  174. MOFS        DW MAX_CHAN_NUMB DUP(0)
  175. MREPEAT        DW MAX_CHAN_NUMB DUP(0)
  176. MREPLEN        DW MAX_CHAN_NUMB DUP(0)
  177. MMAXREP        DW MAX_CHAN_NUMB DUP(0)
  178. MOD_NAME    DB 94 DUP(0)        ;MIND. 40 BYTES
  179. ;-----------------------------------------------------------------------------
  180. ; Seg                           Stores the segment of the current sample.  If
  181. ;                               the segment is zero, then there is no sample
  182. ;                               begin played.
  183. ; Offset                        The current offset of the sample being played
  184. ;                               in the segment specified.
  185. ; MaxRep                        The offset of the place in the sample to
  186. ;                               repeat from (i.e. the end of the sample).
  187. ; Freq                          The frequency to be played out the output
  188. ;                               device.  It is actually a playback period,
  189. ;                               the upper byte determining the number of
  190. ;                               bytes to be added to the sample offset each
  191. ;                               interrupt, and the lower byte to be added
  192. ;                               over and over to generate carry flags to be
  193. ;                               added to additional offsets.
  194. ; Vol                           The actual volume to multiply the frequency
  195. ;                               by.
  196. ; Repeat                        The place to repeat from when the end of the
  197. ;                               loop is found.
  198. ; RepLen                        The number of bytes from Repeat to go to.
  199. ;                               When the end of this is found, it goes back
  200. ;                               to Repeat.
  201. ; OFlow                         The overflow variable used to generate the
  202. ;                               carry flags.
  203. ;-----------------------------------------------------------------------------
  204. ; PROTRACKER VARIABLEN
  205. ;-----------------------------------------------------------------------------
  206. ALIGN 2
  207. MT_SPEED                DB 6
  208. MT_COUNTER              DB 0
  209. MT_PATTERNPOS           DW 0
  210. MT_SONGPOS              DB 0
  211. MT_PATTDELAYTIME2       DB 0
  212. MT_PATTDELAYTIME        DB 0
  213. MT_PBREAKFLAG           DB 0
  214. MT_PBREAKPOS            DB 0
  215. MT_POSJUMPFLAG          DB 0
  216. MT_LOWMASK              DB 0FFH
  217.  
  218. ALIGN 2
  219. Effect_Jump_Table1    LABEL    WORD
  220. DW OFFSET Go_Arpeggio, OFFSET Go_PortaUp, OFFSET Go_PortaDown
  221. DW OFFSET Go_TonePortamento, OFFSET Go_vibrato, OFFSET Go_TonePlusVolSlide
  222. DW OFFSET Go_VibratoPlusVolSlide, OFFSET Go_Tremolo, OFFSET Go_Return
  223. DW OFFSET Go_Return, OFFSET Go_VolumeSlide, OFFSET Go_Return, OFFSET Go_Return
  224. DW OFFSET Go_Return, OFFSET Go_E_Commands, OFFSET Go_Return
  225.  
  226. Effect_Jump_Table2    LABEL    WORD
  227. DW OFFSET Go_PerNop, OFFSET Go_PerNop, OFFSET Go_PerNop
  228. DW OFFSET Go_PerNop, OFFSET Go_PerNop, OFFSET Go_PerNop
  229. DW OFFSET Go_PerNop, OFFSET Go_PerNop, OFFSET Go_PerNop
  230. DW OFFSET Go_SampleOffset, OFFSET Go_PerNop, OFFSET Go_PositionJump
  231. DW OFFSET Go_VolumeChange, OFFSET Go_PatternBreak
  232. DW OFFSET Go_E_Commands, OFFSET Go_SetSpeed
  233.  
  234. Effect_Jump_Table3    LABEL    WORD
  235. DW OFFSET Go_Return, OFFSET Go_FinePortaUp, OFFSET Go_FinePortaDown
  236. DW OFFSET Go_SetGlissControl, OFFSET Go_SetVibratoControl
  237. DW OFFSET Go_SeTFineTune, OFFSET Go_JumpLoop, OFFSET Go_SetTremoloControl
  238. DW OFFSET Go_PANNING, OFFSET Go_RetrigNote, OFFSET Go_VolumeFineUp
  239. DW OFFSET Go_VolumeFineDown, OFFSET Go_NoteCut, OFFSET Go_NoteDelay
  240. DW OFFSET Go_PatternDelay, OFFSET Go_Return
  241.  
  242. ALIGN 2
  243. MT_VIBRATOTABLE        DB   0, 24, 49, 74, 97,120,141,161
  244.                         DB 180,197,212,224,235,244,250,253
  245.                         DB 255,253,250,244,235,224,212,197
  246.                         DB 180,161,141,120, 97, 74, 49, 24
  247.  
  248. ALIGN 2
  249. MT_PERIODTABLE    LABEL    WORD
  250. DW 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to H-1 Finetune +0.
  251. DW 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to H-2 Finetune +0.
  252. DW 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to H-3 Finetune +0.
  253. DW 107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56 ;C-4 to H-4 Finetune +0.
  254.  
  255. DW 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to H-1 Finetune +1.
  256. DW 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to H-2 Finetune +1.
  257. DW 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to H-3 Finetune +1.
  258. DW 106,100, 94, 89, 84, 79, 75, 71, 67, 83, 59, 56 ;C-4 to H-4 Finetune +1.
  259.  
  260. DW 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to H-1 Finetune +2.
  261. DW 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to H-2 Finetune +2.
  262. DW 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to H-3 Finetune +2.
  263. DW 105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59, 56 ;C-4 to H-4 Finetune +2.
  264.  
  265. DW 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to H-1 Finetune +3.
  266. DW 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to H-2 Finetune +3.
  267. DW 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to H-3 Finetune +3.
  268. DW 104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55 ;C-4 to H-4 Finetune +3.
  269.  
  270. DW 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to H-1 Finetune +4.
  271. DW 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to H-2 Finetune +4.
  272. DW 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to H-3 Finetune +4.
  273. DW 104, 98, 92, 87, 82, 78, 73, 69, 65, 62, 58, 55 ;C-4 to H-4 Finetune +4.
  274.  
  275. DW 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to H-1 Finetune +5.
  276. DW 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to H-2 Finetune +5.
  277. DW 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to H-3 Finetune +5.
  278. DW 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58, 54 ;C-4 to H-4 Finetune +5.
  279.  
  280. DW 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to H-1 Finetune +6.
  281. DW 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to H-2 Finetune +6.
  282. DW 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to H-3 Finetune +6.
  283. DW 102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57, 54 ;C-4 to H-4 Finetune +6.
  284.  
  285. DW 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to H-1 Finetune +7.
  286. DW 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to H-2 Finetune +7.
  287. DW 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to H-3 Finetune +7.
  288. DW 102, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57, 54 ;C-4 to H-4 Finetune +7.
  289.  
  290. DW 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to H-1 Finetune -8.
  291. DW 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to H-2 Finetune -8.
  292. DW 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to H-3 Finetune -8.
  293. DW 113,107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60 ;C-4 to H-4 Finetune -8.
  294.  
  295. DW 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to H-1 Finetune -7.
  296. DW 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to H-2 Finetune -7.
  297. DW 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to H-3 Finetune -7.
  298. DW 112,106,100, 94, 89, 84, 79, 75, 71, 67, 63, 59 ;C-4 to H-4 Finetune -7.
  299.  
  300. DW 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to H-1 Finetune -6.
  301. DW 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to H-2 Finetune -6.
  302. DW 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to H-3 Finetune -6.
  303. DW 111,105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -6.
  304.  
  305. DW 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to H-1 Finetune -5.
  306. DW 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to H-2 Finetune -5.
  307. DW 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to H-3 Finetune -5.
  308. DW 111,104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -5.
  309.  
  310. DW 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to H-1 Finetune -4.
  311. DW 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to H-2 Finetune -4.
  312. DW 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to H-3 Finetune -4.
  313. DW 110,104, 98, 92, 87, 82, 78, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -4.
  314.  
  315. DW 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to H-1 Finetune -3.
  316. DW 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to H-2 Finetune -3.
  317. DW 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to H-3 Finetune -3.
  318. DW 109,103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -3.
  319.  
  320. DW 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to H-1 Finetune -2.
  321. DW 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to H-2 Finetune -2.
  322. DW 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to H-3 Finetune -2.
  323. DW 108,102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57 ;C-4 to H-4 Finetune -2.
  324.  
  325. DW 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to H-1 Finetune -1.
  326. DW 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to H-2 Finetune -1.
  327. DW 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to H-3 Finetune -1.
  328. DW 108,101, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57 ;C-4 to H-4 Finetune -1.
  329. ;-----------------------------------------------------------------------------
  330. ; MTM - TRACKSTRUKTUR
  331. ;-----------------------------------------------------------------------------
  332. ALIGN 2
  333. TRACK_NUMBER    DW 0
  334. TRACK_INFO    DB 8 DUP(0)
  335. TRACK_SEG    DW 0
  336. TRACK_HANDLE    DW 0
  337. TRACKS_OFFSET    DW OFFSET TRACK1_DATA, OFFSET TRACK2_DATA, OFFSET TRACK3_DATA
  338.         DW OFFSET TRACK4_DATA, OFFSET TRACK5_DATA, OFFSET TRACK6_DATA
  339.         DW OFFSET TRACK7_DATA, OFFSET TRACK8_DATA
  340. TRACK1_DATA    DB 128 DUP(0)
  341. TRACK2_DATA    DB 128 DUP(0)
  342. TRACK3_DATA    DB 128 DUP(0)
  343. TRACK4_DATA    DB 128 DUP(0)
  344. TRACK5_DATA    DB 128 DUP(0)
  345. TRACK6_DATA    DB 128 DUP(0)
  346. TRACK7_DATA    DB 128 DUP(0)
  347. TRACK8_DATA    DB 128 DUP(0)
  348. ;-----------------------------------------------------------------------------
  349. ; MOD - DATEISTRUKTUR
  350. ;-----------------------------------------------------------------------------
  351. ALIGN 2
  352. SAMPLE_SIZE    DW 0
  353. PATTERN_SIZE    DW 0
  354. PATTERN_SEG    DW 0
  355. PATTERN_NUMBER    DW 0
  356. PATTERN_CURRENT    DW 0
  357. ISIZE        DW 31 DUP(0)
  358. IVOL_FINETUNE    DW 31 DUP(0)
  359. ILOOP_START    DW 31 DUP(0)
  360. ILOOP_SIZE    DW 31 DUP(0)
  361. SONG_SIZE    DB 0
  362. SONG_LOOP    DB 0
  363. MOD_SIGN    DD 0
  364. SAMPLE_SEG    DW 31 DUP(0)
  365. ;-----------------------------------------------------------------------------
  366. ; SINGLE SAMPLE VARIABLES
  367. ;-----------------------------------------------------------------------------
  368. SAMPLE_ZEIG    DW 0
  369. SAMPLE_MEM    DW 64 DUP(0)
  370. SAMPLE_BIG    DW 64 DUP(0)
  371. EMS_SEG        DW 0
  372. EMS_OFFSET    DW 0
  373. EMS_HANDLE    DW 0
  374. SAM_SEG        DW FX_CHAN_NUMB DUP(0)
  375. SAM_OFS        DD FX_CHAN_NUMB DUP(0)
  376. SAM_FRQ        DW FX_CHAN_NUMB DUP(0)
  377. SAM_FIX        DW FX_CHAN_NUMB DUP(0)
  378. SAM_OFL        DW FX_CHAN_NUMB DUP(0)
  379. SAM_MAX        DW FX_CHAN_NUMB DUP(0)
  380. SAM_PAN        DW FX_CHAN_NUMB DUP(0)
  381. ;-----------------------------------------------------------------------------
  382. PROG_END        LABEL   BYTE    ;MUSS LETZE ZEILE IM DATENSEGMENT SEIN!
  383. ;-----------------------------------------------------------------------------
  384. DATA_SEG2 ENDS
  385.  
  386. .386
  387. CODE_SEG2 SEGMENT PAGE USE16
  388. ORG 100H
  389. ;=============================================================================
  390. PUBLIC _MAIN2
  391. _MAIN2 PROC FAR
  392.     JMP    MAIN_CONT        ;0100
  393.     RETF
  394.     CALL    CONFIG_INIT        ;0104
  395.     RETF
  396.     CALL    LOAD_MOD        ;0108
  397.     RETF
  398.     CALL    PLAY_MUSIC        ;010C
  399.     RETF
  400.     CALL    STOP_MUSIC        ;0110
  401.     RETF
  402.     CALL    END_MUSIC        ;0114
  403.     RETF
  404.     CALL    LOAD_SAMPLE        ;0118
  405.     RETF
  406.     CALL    PLAY_SAMPLE        ;011C
  407.     RETF
  408.     CALL    END_SAMPLE        ;0120
  409.     RETF
  410.     CALL    SET_SAMPLERATE        ;0124
  411.     RETF
  412.     CALL    GET_VOLUME        ;0128
  413.     RETF
  414.     CALL    SET_VOLUME        ;012C
  415.     RETF
  416.     CALL    SET_SONGLOOP        ;0130
  417.     RETF
  418.     CALL    GET_SONGPOSITION    ;0134
  419.     RETF
  420.     CALL    SET_SONGPOSITION    ;0138
  421.     RETF
  422.     CALL    GET_SONGMOD        ;013C
  423.     RETF
  424.     CALL    SET_SONGMOD        ;0140
  425.     RETF
  426.     CALL    DSP_OFF            ;0144
  427.     RETF
  428.     CALL    DSP_RESET        ;0148
  429.     RETF
  430. _MAIN2 ENDP
  431. ;=============================================================================
  432. ;
  433. ; MOD ROUTINEN
  434. ;
  435. ;=============================================================================
  436. ; Format of a note: (ORIGINALLY MOD)
  437. ;
  438. ;                   0 0          0 0          0 0           0 0
  439. ;                   | |          | |          | |           | |
  440. ;                  /   \        / /          /   \           \ \
  441. ;         MSB of Ins.     Note        LSB Ins.  Spec. Com.   Data for special
  442. ;
  443. ; Format of a note: (MODIFIED BY LOADER)
  444. ;
  445. ;                   0 0          0 0          0 0           0 0
  446. ;                   | |          | |          | |           | |
  447. ;                  / /          /   \         \ \           \ \
  448. ;            LSB NOTE   SPEC.COM.    MSB NOTE  INSTRUMENT    DATA FOR SPECIAL
  449. ;
  450. ;╒═══════════════════════════════════════════════════════════════════════════╕
  451. ;│ DESCRIPTION: This procedure shouldn't need to be called by anything else  │
  452. ;│              but the interrupt (ever).  It handles all note updating,     │
  453. ;│              special effects, pointers, etc.                              │
  454. ;│                                                                           │
  455. ;│              *** This code came directly from the Amiga Protracker        │
  456. ;│                  playback code, written by Lars "Zap" Hamre.  Give this   │
  457. ;│                  guy a pat on the back for such excellent code.           │
  458. ;│                                                                           │
  459. ;│ BUGS       : Or rather, non-implementations.  Command EF - Funk it is     │
  460. ;│              not all the way implemented.  Command E0 - Filter is not     │
  461. ;│              implemented at all.  It is Amiga-specific, directly with     │
  462. ;│              the Paula chip.                                              │
  463. ;│                                                                           │
  464. ;│ IMPROVEMENTS:    Optimized code for PC-architecure by the Frontman        │
  465. ;│                                                                           │
  466. ;╘═══════════════════════════════════════════════════════════════════════════╛
  467. CONTROL_CHANNELS PROC NEAR
  468.     CMP    LOADMOD_FLAG,0
  469.     JNE    Go_NoNewPosYet
  470.     CMP    MOD_STAT,3
  471.     JAE    Go_NoNewPosYet
  472.     INC    MT_COUNTER
  473.     MOV    AL,MT_COUNTER
  474.     CMP    AL,MT_SPEED        ; Does it match the current speed?
  475.     JB    SHORT Go_NoNewNote    ; No, just do fx.
  476.     MOV    MT_COUNTER,0
  477.     CMP    MT_PATTDELAYTIME2,0
  478.     JE    SHORT Go_GetNewNote
  479.         CALL    Go_CheckEfx        ; Otherwise, just do fx only.
  480.         JMP    Go_Dskip                ; Then, jump to update block values.
  481. Go_NoNewNote:
  482.     CALL    Go_CheckEfx        ; Do fx.
  483.         JMP    Go_NoNewPosYet        ; We don't update block values
  484.                     ; when we are just doing fx.
  485. Go_GetNewNote:
  486.     CALL    TRACK_SAVE        ;SAVE EMS PAGES
  487.     CALL    TRACK_PAGING        ;GET TRACKS INTO EMS PAGES
  488.     MOV    ES,TRACK_SEG
  489.     XOR    SI,SI
  490. Go_PlayVoice:
  491.     PUSH    SI
  492.     MOV    DI,SI
  493.     SHL    DI,1
  494.     MOVZX    BX,MT_SONGPOS        ; BLOCK BEGINNING TO ES:BX
  495.     ADD    BX,[TRACKS_OFFSET+DI]
  496.     MOVZX    BX,[BX]
  497.     XCHG    BL,BH            ; MULTIPLY WITH 256 (TRACK-SIZE)
  498.     ADD    BX,MT_PATTERNPOS
  499.     CMP    [NOTE+DI],0        ; See if there is a note.
  500.     JNE    SHORT Go_plvskip    ; No, go on.
  501.     CMP    [CMD+SI],0
  502.     JNE    SHORT Go_plvskip
  503.     CMP    [CMDLO+SI],0
  504.     JNE    SHORT Go_plvskip
  505.     CALL    Go_PerNop        ; Otherwise, figure out the frequency.
  506. Go_plvskip:
  507.     MOV    AX,ES:[BX]        ; Load this channel's information
  508.     MOV    [NOTE+DI],AX        ; from the actual track block and
  509.     AND    [NOTE+DI],0FFFH
  510.     SHR    AH,4            ; into our own internal structure
  511.     MOV    [CMD+SI],AH        ; to access it from.
  512.     MOV    AX,ES:[BX+2]
  513.     MOV    [CMDLO+SI],AH
  514.     OR    AL,AL            ; Instrument byte.  Is there an ins?
  515.     JZ    SHORT Go_SetRegs
  516.     DEC    AL
  517.     MOVZX    BX,AL            ; GET SAMPLE SEGMENT
  518.     SHL    BX,1
  519.     MOV    AX,[SAMPLE_SEG+BX]
  520.     MOV    [START+DI],AX        ; Store it in our structure.
  521.     MOV    AX,[ISIZE+BX]        ; Get the length.
  522.     MOV    [LENGTHI+DI],AX        ; Store it appropriately.
  523.     MOV    AX,[IVOL_FINETUNE+BX]    ; Get the instrument volume and fine tune.
  524.     MOV    [VOLUME+SI],AL        ; Store it appropriately.
  525.     MOV    [FINETUNE+SI],AH
  526.     MOV    [MVOL+SI],AL
  527.     MOV    CX,[ILOOP_SIZE+BX]    ; Get Repeat length
  528.     CMP    CX,8            ; If the length is less than four,
  529.     JB    SHORT Go_NoLoop        ; then there is no loop.
  530.     MOV    AX,[ILOOP_START+BX]    ; Get the Repeat start.
  531.     MOV    [MREPEAT+DI],AX        ; Move it into the appropriate
  532.     MOV    [LOOPSTART+DI],AX    ; structures and locations.
  533.     MOV    [REPLEN+DI],CX        ; Move the length into its storage.
  534.     ADD    AX,CX            ; We're figuring out the offset of
  535.     MOV    [MREPLEN+DI],AX
  536.     MOV    [MMAXREP+DI],AX        ; where the repeat length breaks.
  537.     JMP    SHORT Go_SetRegs    ; Skip the no loop part.
  538. Go_NoLoop:
  539.     XOR    AX,AX            ; Zero out AX.
  540.     MOV    [REPLEN+DI],AX
  541.     MOV    [MREPLEN+DI],AX        ; Make sure that no loop exists and
  542.     MOV    [MREPEAT+DI],AX
  543.     MOV    [LOOPSTART+DI],AX
  544. Go_SetRegs:
  545.     CMP    [NOTE+DI],0        ; Grab the note.
  546.     JE    Go_CheckMore        ; Check the fx.
  547.     MOV    AH,[CMD+SI]        ; Get the special fx command.
  548.     MOV    AL,[CMDLO+SI]
  549.     AND    AL,0F0H            ; Mask out the bits we don't want.
  550.     CMP    AX,0E50H        ; Is there a fine tune command
  551.     JE    SHORT Go_DoSetFineTune
  552.     CMP    AH,3            ; Is it a tone portamento?
  553.     JE    SHORT Go_ChkTonePorta
  554.     CMP    AH,5            ; Is it a tone and volume slide?
  555.     JE    SHORT Go_ChkTonePorta
  556.     CMP    AH,9            ; Is it a sample offset command?
  557.     JNE    SHORT Go_SetPeriod    ; If not, go do the actual note.
  558.     PUSH    AX            ; keep the command byte in mem
  559.     CALL    Go_CheckMoreEfx
  560.     POP    AX
  561.     JMP    SHORT Go_SetPeriod    ; Go do the actual note.
  562. Go_ChkTonePorta:
  563.     CALL    Go_SetTonePorta        ; Do part of the tone portamento.
  564.     JMP    Go_CheckMore        ; Go do the fx.
  565. Go_DoSetFineTune:
  566.     PUSH    AX
  567.     MOV    AL,[CMDLO+SI]
  568.     AND    AL,0FH
  569.     CALL    Go_SetFineTune        ; Update the fine tune.
  570.     POP    AX
  571. ;-----------------------------------------------------------------------------
  572. ; ──── We are now going to find the note in the period table.  If it
  573. ; ──── doesn't exist, then no fine tuning can be performed.  If it
  574. ; ──── does, and fine tuning is specified, then we can update it.
  575. ;-----------------------------------------------------------------------------
  576. Go_SetPeriod:
  577.     MOV    CL,AH
  578.     MOV    AX,[NOTE+DI]        ; Get the note.
  579.     DEC    AX
  580.     MOV    BX,OFFSET MT_PERIODTABLE; Set pointer to beginning of table.
  581.     CMP    CL,3
  582.     JE    SHORT Seek_Period
  583.     CMP    CL,5
  584.     JNE    SHORT Go_ftufound
  585. Seek_Period:
  586.     INC    AX
  587.     MOV    CX,36+12        ; 36 periods to cycle through.
  588. Go_ftuloop:
  589.     CMP    AX,[BX]            ; Check the note against the period.
  590.     JAE    SHORT Go_Wizzyfound    ; We found it!
  591.     INC    BX
  592.     INC    BX            ; Otherwise, update the pointer and
  593.     LOOP    Go_ftuloop        ; keep looping.
  594.     JMP    SHORT Go_Wizzyfound
  595. Go_ftufound:
  596.     ADD    BX,AX
  597. Go_WizzyFound:
  598.     MOV    AL,[FINETUNE+SI]    ; Get the fine tune.
  599.     MOV    CL,(36+12)*2        ; The period table's size is 72.
  600.     MUL    CL            ; Multiply it by the fine tune.
  601.     ADD    BX,AX            ; Add it onto the pointer to point to
  602.     MOV    AX,[BX]            ; the new period and get it.
  603.     MOV    [PERIOD+DI],AX        ; Store it.
  604.     MOV    AH,[CMD+SI]        ; Get the special fx command.
  605.     MOV    AL,[CMDLO+SI]
  606.     AND    AL,0F0H            ; Mask out the bits we don't want.
  607.     CMP    AX,0ED0H
  608.     JE    SHORT Go_delnoc
  609.     MOV    AL,[WAVECONTROL+SI]    ; Get the WaveControl.
  610.     TEST    AL,00000100B        ; Amiga: BTST #2,WaveControl.
  611.     JZ    SHORT Go_vibnoc        ; If it is zero, then skip.
  612.     MOV    [VIBRATOPOS+SI],0
  613. Go_vibnoc:
  614.     TEST    AL,01000000B        ; Amiga: BTST #6,WaveControl
  615.     JZ    SHORT Go_trenoc        ; If it is zero, then skip.
  616.     MOV    [TREMOLOPOS+SI],0    ; Zero the Tremolo offset.
  617. Go_trenoc:
  618.     MOV    AX,[START+DI]        ; Get the start segment.
  619.     MOV    [MSEG+DI],AX        ; Store it to be updated.
  620.     MOV    [MOFS+DI],0        ; Set the offset to zero.
  621.     MOV    [MOFLOW+SI],0
  622.     MOV    AX,[LENGTHI+DI]
  623.     MOV    [MMAXREP+DI],AX        ; Store in MaxRepeat
  624.     MOV    CX,[PERIOD+DI]
  625.     CALL    Go_PerNop2
  626.     JMP    SHORT Go_CheckMore
  627. Go_delnoc:
  628.     MOV    AX,[MMAXREP+DI]
  629.     MOV    [MOFS+DI],AX
  630. Go_CheckMore:
  631.     CALL    Go_CheckMoreEfx
  632. Go_DoNext:
  633.     POP    SI            ;SKIP TO NEXT CHANNEL
  634.     INC    SI
  635.     CMP    SI,CH_NUMB
  636.     JB    Go_PlayVoice
  637.     CALL    TRACK_RESTORE        ;RESTORE EMS PAGES
  638. ;-----------------------------------------------------------------------------
  639. Go_Dskip:
  640.     ADD    MT_PATTERNPOS,4        ; Increment position by one
  641.     MOV    AL,MT_PATTDELAYTIME
  642.     OR    AL,AL
  643.     JZ    SHORT Go_dskc
  644.     MOV    MT_PATTDELAYTIME2,AL
  645.     MOV    MT_PATTDELAYTIME,0
  646. Go_dskc:
  647.     CMP    MT_PATTDELAYTIME2,0
  648.     JE    SHORT Go_dska
  649.     DEC    MT_PATTDELAYTIME2
  650.     JZ    SHORT Go_dska
  651.     SUB    MT_PATTERNPOS,4
  652. Go_dska:
  653.     CMP    MT_PBREAKFLAG,0
  654.     JE    SHORT Go_nnpysk
  655.     MOV    MT_PBREAKFLAG,0
  656.     MOVZX    AX,MT_PBREAKPOS
  657.     MOV    MT_PBREAKPOS,AH
  658.     SHL    AX,2
  659.     MOV    MT_PATTERNPOS,AX
  660. Go_nnpysk:
  661.     CMP    MT_PATTERNPOS,256
  662.     JB    SHORT Go_NoNewPosYet
  663. Go_NextPosition:
  664.     MOVZX    AX,MT_PBREAKPOS
  665.     SHL    AX,2
  666.     MOV    MT_PATTERNPOS,AX
  667.     MOV    MT_PBREAKPOS,0
  668.     MOV    MT_POSJUMPFLAG,0
  669.     MOV    AL,MT_SONGPOS
  670.     INC    AL
  671.     AND    AL,7FH
  672.     MOV    MT_SONGPOS,AL
  673.     CMP    AL,SONG_SIZE
  674.     JB    SHORT Go_NoNewPosYet
  675.     MOV    AL,SONG_LOOP
  676.     CMP    AL,SONG_SIZE
  677.     JB    SHORT Go_NoSongRestart
  678.     MOV    MOD_STAT,3
  679.     XOR    AL,AL
  680. Go_NoSongRestart:
  681.     MOV    MT_SONGPOS,AL
  682.     MOV    MT_SPEED,6        ;DEFAULT PROTRACKER SPEED
  683.     MOV    MT_COUNTER,0        ;RESET PROTRACKER VARIABLES
  684.     MOV    AL,125
  685.     CALL    Go_SetBPM
  686.     MOV    BPM_COUNT,0
  687. Go_NoNewPosYet:
  688.     CMP    MT_POSJUMPFLAG,0
  689.     JNE    Go_NextPosition
  690.     RET
  691. CONTROL_CHANNELS ENDP
  692. ;=============================================================================
  693. Go_CheckEfx PROC NEAR
  694.     XOR    SI,SI
  695. Go_DoEfx:
  696.     PUSH    SI
  697.     MOV    DI,SI
  698.     SHL    DI,1
  699.     MOV    BL,[CMD+SI]              ; Get the special command
  700.     MOV    BH,[CMDLO+SI]
  701.     OR    BX,BX
  702.     JNZ    SHORT SetBack1
  703.     CALL    Go_PerNop
  704.     JMP    SHORT SetBack2
  705. SetBack1:
  706.     XOR    BH,BH
  707.     SHL    BX,1
  708.     CALL    [Effect_Jump_Table1+BX]
  709. SetBack2:
  710.     POP    SI
  711.     INC    SI
  712.     CMP    SI,CH_NUMB
  713.     JB    Go_DoEfx
  714. Go_Return:
  715.     RET
  716. ;-----------------------------------------------------------------------------
  717. Go_PerNop PROC NEAR
  718.     MOV    CX,[PERIOD+DI]
  719. Go_PerNop2 PROC NEAR
  720.     PUSH    EAX ECX EDX
  721.     XOR    EAX,EAX
  722.     JCXZ    SHORT Go_DivZero
  723.     AND    ECX,0FFFFH
  724.     XOR    EDX,EDX
  725.     MOV    EAX,MAINFREQ
  726.     DIV    ECX
  727. Go_DivZero:
  728.     MOV    [MFIXED+DI],AX
  729.     SHR    EAX,16
  730.     MOV    [MFREQ+DI],AX
  731.     POP    EDX ECX EAX
  732.     RET
  733. Go_PerNop2 ENDP
  734. Go_PerNop ENDP
  735. Go_CheckEfx ENDP
  736. ;=============================================================================
  737. ;
  738. ; SI IS THE CHANNEL-BYTE-INDEX, DI IS THE CHANNEL-WORD-INDEX
  739. ;
  740. ;─────────────────────────────────────────────────────────────────────────────
  741. ; Effect 0 -- Arpeggio
  742. ;─────────────────────────────────────────────────────────────────────────────
  743. Go_Arpeggio PROC NEAR
  744.     MOVZX    AX,MT_COUNTER
  745.     MOV    BL,3
  746.     MOV    CX,[PERIOD+DI]
  747.     DIV    BL
  748.     OR    AH,AH
  749.     JZ    SHORT Go_Arpeggio1
  750.     MOV    AL,[CMDLO+SI]
  751.     CMP    AH,2
  752.     JE    SHORT Go_Arpeggio2
  753.     SHR    AL,4
  754. Go_Arpeggio2:
  755.     AND    AL,0FH
  756.     SHL    AL,1
  757.     MOVZX    BX,AL
  758.     MOV    AL,[FINETUNE+SI]
  759.     MOV    DX,CX
  760.     MOV    CL,(36+12)*2
  761.     MUL    CL
  762.     PUSH    DI
  763.     MOV    DI,OFFSET MT_PERIODTABLE
  764.     ADD    DI,AX
  765.     MOV    AH,36+12
  766. Go_arploop:
  767.     MOV    CX,[BX+DI]
  768.     CMP    DX,[DI]
  769.     JAE    SHORT Go_arpafterloop
  770.         INC    DI
  771.     INC    DI
  772.     DEC    AH
  773.     JNZ    Go_arploop
  774.     POP    DI
  775.     RET
  776. Go_arpafterloop:
  777.     POP    DI
  778. Go_Arpeggio1:
  779.     CALL    Go_PerNop2
  780.         RET
  781. Go_Arpeggio ENDP
  782. ;─────────────────────────────────────────────────────────────────────────────
  783. ; Effect 1 -- Portamento Up
  784. ;─────────────────────────────────────────────────────────────────────────────
  785. Go_PortaUp PROC NEAR
  786.     MOVZX    AX,[CMDLO+SI]        ; Number to slide up (was lo)
  787.     AND    AL,MT_LOWMASK
  788.     MOV    MT_LOWMASK,0FFH
  789.     SUB    [PERIOD+DI],AX
  790.     MOV    CX,[PERIOD+DI]
  791.     CMP    CX,113
  792.     JGE    SHORT Go_PortaUSkip
  793.     MOV    CX,113
  794.     MOV    [PERIOD+DI],CX
  795. Go_PortaUSkip:
  796.     CALL    Go_PerNop2
  797.     RET
  798. Go_PortaUp ENDP
  799. ;────────────────────────────────────────────────────────────────────────────
  800. ; Effect 2 -- Portamento Down
  801. ;────────────────────────────────────────────────────────────────────────────
  802. Go_PortaDown PROC NEAR
  803.     MOVZX    AX,[CMDLO+SI]        ; Number to slide down
  804.     AND    AL,MT_LOWMASK
  805.     MOV    MT_LOWMASK,0FFH
  806.     ADD    [PERIOD+DI],AX
  807.     MOV    CX,[PERIOD+DI]
  808.     CMP    CX,856
  809.     JL    SHORT Go_PortaDSkip
  810.     MOV    CX,856
  811.     MOV    [PERIOD+DI],CX
  812. Go_PortaDSkip:
  813.     CALL    Go_PerNop2
  814.     RET
  815. Go_PortaDown ENDP
  816. ;────────────────────────────────────────────────────────────────────────────
  817. ; Effect 3 -- Tone Portamento
  818. ;────────────────────────────────────────────────────────────────────────────
  819. Go_TonePortamento PROC NEAR
  820.     MOV    AL,[CMDLO+SI]
  821.     OR    AL,AL
  822.     JZ    SHORT Go_TonePortNoChange
  823.     MOV    [TONEPORTSPEED+SI],AL
  824.     MOV    [CMDLO+SI],0
  825. Go_TonePortNoChange:
  826.     CMP    [WANTEDPERIOD+DI],0
  827.     JZ    Go_Return
  828.     MOVZX    DX,[TONEPORTSPEED+SI]
  829.     MOV    CX,[PERIOD+DI]
  830.     MOV    AX,[WANTEDPERIOD+DI]
  831.     CMP    [TONEPORTDIREC+SI],0
  832.     JNE    SHORT Go_TonePortaUp
  833. Go_TonePortaDown:
  834.     ADD    CX,DX
  835.     CMP    AX,CX
  836.     JG    SHORT Go_TonePortaSetPer
  837.     JMP    SHORT Go_TonePortaEnd
  838. Go_TonePortaUp:
  839.     SUB    CX,DX
  840.     CMP    AX,CX
  841.     JL    SHORT Go_TonePortaSetPer
  842. Go_TonePortaEnd:
  843.     MOV    CX,AX
  844.     MOV    [WANTEDPERIOD+DI],0
  845. Go_TonePortaSetPer:
  846.     MOV    [PERIOD+DI],CX
  847.     MOV    AL,[GLISSFUNK+SI]
  848.     AND    AL,0FH
  849.     JZ    SHORT Go_GlissSkip
  850.     MOV    AL,[FINETUNE+SI]
  851.     MOV    BL,(36+12)*2
  852.     MUL    BL
  853.     PUSH    DI
  854.     MOV    DI,OFFSET MT_PERIODTABLE
  855.     ADD    DI,AX
  856.     XOR    BX,BX
  857. Go_GlissLoop:
  858.     CMP    CX,[BX+DI]
  859.     JAE    SHORT Go_GlissFound
  860.     INC    BX
  861.     INC    BX
  862.     CMP    BX,(36+12)*2
  863.     JB    Go_GlissLoop
  864.     MOV    BX,(35+12)*2
  865. Go_GlissFound:
  866.     MOV    CX,[BX+DI]
  867.     POP    DI
  868. Go_GlissSkip:
  869.     CALL    Go_PerNop2
  870.     RET
  871. Go_TonePortamento ENDP
  872. ;-----------------------------------------------------------------------------
  873. Go_SetTonePorta PROC NEAR
  874.     MOV    DX,[NOTE+DI]
  875.     MOV    AL,[FINETUNE+SI]
  876.     MOV    CL,48*2            ;37
  877.     MUL    CL
  878.     PUSH    DI
  879.     MOV    DI,OFFSET MT_PERIODTABLE
  880.     ADD    DI,AX
  881.     XOR    BX,BX
  882. Go_StpLoop:
  883.     CMP    DX,[BX+DI]
  884.     JAE    SHORT Go_StpFound
  885.     INC    BX
  886.     INC    BX
  887.     CMP    BX,48*2            ;37
  888.     JB    Go_StpLoop
  889.     MOV    BX,47*2            ;35
  890. Go_StpFound:
  891.     MOV    DL,[FINETUNE+SI]
  892.     AND    DL,8
  893.     JZ    SHORT Go_StpGoss
  894.     OR    BX,BX
  895.     JZ    SHORT Go_StpGoss
  896.     DEC    BX
  897.     DEC    BX
  898. Go_StpGoss:
  899.     MOV    DX,[BX+DI]
  900.     POP    DI
  901.     MOV    [WANTEDPERIOD+DI],DX
  902.     MOV    AX,[PERIOD+DI]
  903.     MOV    [TONEPORTDIREC+SI],0
  904.     CMP    DX,AX
  905.     JE    SHORT Go_ClearTonePorta
  906.     JA    Go_Return
  907.     INC    [TONEPORTDIREC+SI]
  908.     RET
  909. Go_ClearTonePorta:
  910.     MOV    [WANTEDPERIOD+DI],0
  911.     RET
  912. Go_SetTonePorta ENDP
  913. ;────────────────────────────────────────────────────────────────────────────
  914. ; Effect 4 -- Vibrato
  915. ;────────────────────────────────────────────────────────────────────────────
  916. Go_Vibrato PROC NEAR
  917.     MOV    AL,[CMDLO+SI]
  918.     OR    AL,AL
  919.     JZ    SHORT Go_Vibrato2
  920.     MOV    BL,[VIBRATOCMD+SI]
  921.     AND    AL,0FH
  922.     JZ    SHORT Go_vibskip
  923.     AND    BL,0F0H
  924.     OR    BL,AL
  925. Go_vibskip:
  926.     MOV    AL,[CMDLO+SI]
  927.     AND    AL,0F0H
  928.     JZ    SHORT Go_vibskip2
  929.     AND    BL,0FH
  930.     OR    BL,AL
  931. Go_vibskip2:
  932.     MOV    [VIBRATOCMD+SI],BL
  933. Go_Vibrato2:
  934.     MOV    AL,[VIBRATOPOS+SI]
  935.     SHR    AL,2
  936.     AND    AX,1FH
  937.     MOV    BL,[WAVECONTROL+SI]
  938.     AND    BL,3
  939.     JZ    SHORT Go_vib_sine
  940.     SHL    AL,3
  941.     CMP    BL,1
  942.     JE    SHORT Go_vib_rampdown
  943.     MOV    BL,255
  944.     JMP    SHORT Go_vib_set
  945. Go_vib_rampdown:
  946.     CMP    [VIBRATOPOS+SI],0
  947.     JG    SHORT Go_vib_rampdown2
  948.     MOV    BL,AL
  949.     NOT    BL
  950.     JMP    SHORT Go_vib_set
  951. Go_vib_rampdown2:
  952.     MOV    BL,AL
  953.     JMP    SHORT Go_vib_set
  954. Go_vib_sine:
  955.     MOVZX    BX,AL
  956.     MOV    BL,[MT_VIBRATOTABLE+BX]
  957. Go_vib_set:
  958.     MOV    AL,[VIBRATOCMD+SI]
  959.     AND    AL,0FH
  960.     MUL    BL
  961.     SHR    AX,7
  962.     MOV    BX,AX
  963.     MOV    AX,[PERIOD+DI]
  964.     CMP    [VIBRATOPOS+SI],0
  965.     JG    SHORT Go_VibratoNeg    ; BMI
  966.     NEG    BX
  967. Go_VibratoNeg:
  968.     ADD    AX,BX
  969. Go_Vibrato3:
  970.     MOV    CX,AX
  971.     CALL    Go_PerNop2
  972.     MOV    AL,[VIBRATOCMD+SI]
  973.     AND    AL,0F0H
  974.     SHR    AL,2
  975.     ADD    [VIBRATOPOS+SI],AL
  976.     RET
  977. Go_Vibrato ENDP
  978. ;────────────────────────────────────────────────────────────────────────────
  979. ; Effect 5 -- Tone and Volume Slide
  980. ;────────────────────────────────────────────────────────────────────────────
  981. Go_TonePlusVolSlide PROC NEAR
  982.     CALL    Go_TonePortNoChange
  983.     JMP    Go_VolumeSlide
  984. Go_TonePlusVolSlide ENDP
  985. ;────────────────────────────────────────────────────────────────────────────
  986. ; Effect 6 -- Vibrato and Volume Slide
  987. ;────────────────────────────────────────────────────────────────────────────
  988. Go_VibratoPlusVolSlide PROC NEAR
  989.     CALL    Go_Vibrato2        ;was mt_vibrato2
  990.     JMP    Go_VolumeSlide
  991. Go_VibratoPlusVolSlide ENDP
  992. ;────────────────────────────────────────────────────────────────────────────
  993. ; Effect 7 -- Tremolo
  994. ;────────────────────────────────────────────────────────────────────────────
  995. Go_Tremolo PROC NEAR
  996.     MOV    AL,[CMDLO+SI]
  997.     OR    AL,AL
  998.     JZ    SHORT Go_Tremolo2
  999.     MOV    BL,[TREMOLOCMD+SI]
  1000.     AND    AL,0FH
  1001.     JZ    SHORT Go_treskip
  1002.     AND    BL,0F0H
  1003.     OR    BL,AL
  1004. Go_treskip:
  1005.     MOV    AL,[CMDLO+SI]
  1006.     AND    AL,0F0H
  1007.     JZ    SHORT Go_treskip2
  1008.     AND    BL,0FH
  1009.     OR    BL,AL
  1010. Go_treskip2:
  1011.     MOV    [TREMOLOCMD+SI],BL
  1012. Go_Tremolo2:
  1013.     MOV    AL,[TREMOLOPOS+SI]
  1014.     SHR    AL,2
  1015.     AND    AX,1FH
  1016.     MOV    BL,[WAVECONTROL+SI]
  1017.     SHR    BL,4
  1018.     AND    BL,3
  1019.     JZ    SHORT Go_tre_sine
  1020.     SHL    AL,3
  1021.     CMP    BL,1
  1022.     JE    SHORT Go_tre_rampdown
  1023.     MOV    BL,255
  1024.     JMP    SHORT Go_tre_set
  1025. Go_tre_rampdown:
  1026.     CMP    [TREMOLOPOS+SI],0
  1027.     JG    SHORT Go_tre_rampdown2
  1028.     MOV    BL,AL
  1029.     NOT    BL
  1030.     JMP    SHORT Go_tre_set
  1031. Go_tre_rampdown2:
  1032.     MOV    BL,AL
  1033.     JMP    SHORT Go_tre_set
  1034. Go_tre_sine:
  1035.     MOVZX    BX,AL
  1036.     MOV    BL,[MT_VIBRATOTABLE+BX]
  1037. Go_tre_set:
  1038.     MOV    AL,[TREMOLOCMD+SI]
  1039.     AND    AL,0FH
  1040.     MUL    BL
  1041.     MOV    BX,AX
  1042.     SHR    BX,6
  1043.     MOV    AL,[VOLUME+SI]
  1044.     CMP    [TREMOLOPOS+SI],0
  1045.     JG    SHORT Go_TremoloNeg        ; BMI  jns
  1046.     ADD    AL,BL
  1047.     JMP    SHORT Go_Tremolo3
  1048. Go_TremoloNeg:
  1049.     SUB    AL,BL
  1050. Go_Tremolo3:
  1051.     JNC    SHORT Go_TremoloSkip
  1052.     XOR    AX,AX
  1053. Go_TremoloSkip:
  1054.     CMP    AL,40H
  1055.     JBE    SHORT Go_TremoloOK        ; BLS
  1056.     MOV    AL,40H
  1057. Go_TremoloOK:
  1058.     MOV    [MVOL+SI],AL            ;was ah
  1059.     MOV    AL,[TREMOLOCMD+SI]
  1060.     AND    AL,0F0H
  1061.     SHR    AL,2
  1062.     ADD    [TREMOLOPOS+SI],AL
  1063.     RET
  1064. Go_Tremolo ENDP
  1065. ;────────────────────────────────────────────────────────────────────────────
  1066. ; Effect 9 -- Sample Offset
  1067. ;────────────────────────────────────────────────────────────────────────────
  1068. Go_SampleOffset PROC NEAR
  1069.     MOVZX    AX,[CMDLO+SI]
  1070.     OR    AL,AL
  1071.     JZ    SHORT Go_sononew
  1072.     MOV    [SAMPLEOFFSET+SI],AL
  1073. Go_sononew:
  1074.     MOVZX    AX,[SAMPLEOFFSET+SI]
  1075.     XCHG    AL,AH
  1076.     CMP    AX,[MMAXREP+DI]
  1077.     JAE    SHORT Go_sofskip
  1078.     MOV    [MOFS+DI],AX
  1079.     RET
  1080. Go_sofskip:
  1081.     MOV    AX,[MOFS+DI]
  1082.     MOV    [MMAXREP+DI],AX
  1083.     RET
  1084. Go_SampleOffset ENDP
  1085. ;────────────────────────────────────────────────────────────────────────────
  1086. ; Effect A -- Volume Slide
  1087. ;────────────────────────────────────────────────────────────────────────────
  1088. Go_VolumeSlide PROC NEAR
  1089.     MOV    AL,[CMDLO+SI]
  1090.     SHR    AL,4
  1091.     OR    AL,AL
  1092.     JZ    SHORT Go_VolSlideDown
  1093. Go_VolSlideUp:
  1094.     ADD    [VOLUME+SI],AL
  1095.     CMP    [VOLUME+SI],40H
  1096.     JBE    SHORT Go_vsdskip
  1097.     MOV    [VOLUME+SI],40H
  1098.     JMP    SHORT Go_vsdskip
  1099. Go_VolSlideDown:
  1100.     MOV    AL,[CMDLO+SI]
  1101.     AND    AL,0FH
  1102. Go_VolSlideDown2:
  1103.     SUB    [VOLUME+SI],AL
  1104.     JNC    SHORT Go_vsdskip
  1105.     MOV    [VOLUME+SI],0
  1106. Go_vsdskip:
  1107.     MOV    AL,[VOLUME+SI]
  1108.     MOV    [MVOL+SI],AL        ;was ah
  1109.     RET
  1110. Go_VolumeSlide ENDP
  1111. ;────────────────────────────────────────────────────────────────────────────
  1112. ; Effect B -- Position Jump
  1113. ;────────────────────────────────────────────────────────────────────────────
  1114. Go_PositionJump PROC NEAR
  1115.     MOV    AL,[CMDLO+SI]        ; Get where to jump
  1116.     DEC    AL            ; Update the
  1117.     MOV    MT_SONGPOS,AL        ; information.
  1118. Go_pj2:    MOV    MT_PBREAKPOS,0
  1119.     MOV    MT_POSJUMPFLAG,1
  1120.     RET
  1121. Go_PositionJump ENDP
  1122. ;────────────────────────────────────────────────────────────────────────────
  1123. ; Effect C -- Volume Change
  1124. ;────────────────────────────────────────────────────────────────────────────
  1125. Go_VolumeChange PROC NEAR
  1126.     MOV    AL,[CMDLO+SI]        ; Get value for volume
  1127.     CMP    AL,40H            ; Is it greater than 40h?
  1128.     JBE    SHORT Go_VolumeOK    ; Nope
  1129.     MOV    AL,40H
  1130. Go_VolumeOK:
  1131.     MOV    [VOLUME+SI],AL
  1132.     MOV    [MVOL+SI],AL        ;was ah
  1133.     RET
  1134. Go_VolumeChange ENDP
  1135. ;────────────────────────────────────────────────────────────────────────────
  1136. ; Effect D -- Pattern Break
  1137. ;────────────────────────────────────────────────────────────────────────────
  1138. Go_PatternBreak PROC NEAR
  1139.     MOV    AL,[CMDLO+SI]        ; Break to where?
  1140.     MOV    BL,AL            ; POSITION IS IN DECIMAL
  1141.     SHR    AL,4
  1142.     MOV    CL,10
  1143.     MUL    CL
  1144.     AND    BL,0FH
  1145.     ADD    AL,BL
  1146.     CMP    AL,63
  1147.     JG    Go_pj2
  1148.     MOV    MT_PBREAKPOS,AL
  1149.     MOV    MT_POSJUMPFLAG,1
  1150.     RET
  1151. Go_PatternBreak ENDP
  1152. ;────────────────────────────────────────────────────────────────────────────
  1153. ; Effect F -- Set Speed
  1154. ;────────────────────────────────────────────────────────────────────────────
  1155. Go_SetSpeed PROC NEAR
  1156.     MOV    AL,[CMDLO+SI]        ; Get value for speed
  1157.     OR    AL,AL
  1158.     JZ    Go_Return
  1159.     CMP    AL,32            ; Is it a BPM value ?
  1160.     JAE    SHORT Go_SetBPM
  1161.     MOV    MT_COUNTER,0
  1162.     MOV    MT_SPEED,AL
  1163.     RET
  1164. Go_SetBPM:
  1165.     XOR    AH,AH
  1166.     MOV    BPM_VALUE,AX
  1167.     CMP    AL,76            ; MIXROUTINE CANT HANDLE LESS THAN 76
  1168.     JAE    SHORT Go_CheckBPM1
  1169.     MOV    AL,76
  1170. Go_CheckBPM1:
  1171.     CMP    AL,202            ; MIXROUTINE CANT HANDLE MORE THAN 202
  1172.     JBE    SHORT Go_CheckBPM2
  1173.     MOV    AL,202
  1174. Go_CheckBPM2:
  1175.     SHL    AX,1
  1176.     MOV    BL,5            ; Denna bit är för att ställa
  1177.     DIV    BL            ; EFFECTs till annat än 50Hz
  1178.     MOV    DL,AL            ; Detta ger automatiskt en annan
  1179.     XOR    DH,DH            ; PATT_SPEED.; Hz=2*BPM/5
  1180.     XOR    AX,AX
  1181.     MOV    BX,BPM_RATE
  1182.     DIV    BX
  1183.     MOV    WORD PTR BPM_SPEED,AX
  1184.     XOR    AX,AX
  1185.     DIV    BX
  1186.     MOV    WORD PTR BPM_SPEED+2,AX
  1187.     RET
  1188. Go_SetSpeed ENDP
  1189. ;=============================================================================
  1190. Go_CheckMoreEfx PROC NEAR
  1191.     MOVZX    BX,[CMD+SI]
  1192.     SHL    BL,1
  1193.     JMP    [Effect_Jump_Table2+BX]
  1194. Go_CheckMoreEfx ENDP
  1195. ;─────────────────────────────────────────────────────────────────────────────
  1196. ; Effect E
  1197. ;─────────────────────────────────────────────────────────────────────────────
  1198. Go_E_Commands PROC NEAR
  1199.     MOVZX    BX,[CMDLO+SI]
  1200.     SHR    BL,4
  1201.     SHL    BL,1
  1202.     MOV    AL,[CMDLO+SI]
  1203.     AND    AL,0FH
  1204.     JMP    [Effect_Jump_Table3+BX]
  1205. ;-----------------------------------------------------------------------------
  1206. ; Effect 0 -- FilterOnOff
  1207. ; Effect 1 -- Fine Porta Up
  1208. ;-----------------------------------------------------------------------------
  1209. Go_FinePortaUp:
  1210.     CMP    MT_COUNTER,0
  1211.     JNE    Go_Return
  1212.     MOV    MT_LOWMASK,0FH
  1213.     JMP    Go_PortaUp
  1214. ;-----------------------------------------------------------------------------
  1215. ; Effect 2 -- Fine Porta Down
  1216. ;-----------------------------------------------------------------------------
  1217. Go_FinePortaDown:
  1218.     CMP    MT_COUNTER,0
  1219.     JNE    Go_Return
  1220.     MOV    MT_LOWMASK,0FH
  1221.     JMP    Go_PortaDown
  1222. ;-----------------------------------------------------------------------------
  1223. ; Effect 3 -- Set Gliss Control
  1224. ;-----------------------------------------------------------------------------
  1225. Go_SetGlissControl:
  1226.     AND    [GLISSFUNK+SI],0F0H
  1227.     OR    [GLISSFUNK+SI],AL
  1228.     RET
  1229. ;-----------------------------------------------------------------------------
  1230. ; Effect 4 -- Set Vibrato Control
  1231. ;-----------------------------------------------------------------------------
  1232. Go_SetVibratoControl:
  1233.     AND    [WAVECONTROL+SI],0F0H
  1234.     OR    [WAVECONTROL+SI],AL
  1235.     RET
  1236. ;-----------------------------------------------------------------------------
  1237. ; Effect 5 -- Set Fine Tune
  1238. ;-----------------------------------------------------------------------------
  1239. Go_SetFineTune:
  1240.     MOV    [FINETUNE+SI],AL
  1241.     RET
  1242. ;-----------------------------------------------------------------------------
  1243. ; Effect 6 -- Jump Loop
  1244. ;-----------------------------------------------------------------------------
  1245. Go_JumpLoop:
  1246.     CMP    MT_COUNTER,0
  1247.     JNE    Go_Return
  1248.     OR    AL,AL
  1249.     JZ    SHORT Go_SetLoop
  1250.     CMP    [LOOPCOUNT+SI],0
  1251.     JE    SHORT Go_jumpcnt
  1252.     DEC    [LOOPCOUNT+SI]
  1253.     JZ    Go_Return
  1254. Go_jmploop:
  1255.     MOV    AL,[PATTPOS+SI]
  1256.     MOV    MT_PBREAKPOS,AL
  1257.     MOV    MT_PBREAKFLAG,1
  1258.     RET
  1259. Go_jumpcnt:
  1260.     MOV    [LOOPCOUNT+SI],AL
  1261.     JMP    Go_jmploop
  1262. Go_SetLoop:
  1263.     MOV    AX,MT_PATTERNPOS
  1264.     SHR    AX,2
  1265.     MOV    [PATTPOS+SI],AL
  1266.     RET
  1267. ;-----------------------------------------------------------------------------
  1268. ; Effect 7 -- Set Tremolo Control
  1269. ;-----------------------------------------------------------------------------
  1270. Go_SetTremoloControl:
  1271.     SHL    AL,4
  1272.     AND    [WAVECONTROL+SI],0FH
  1273.     OR    [WAVECONTROL+SI],AL
  1274.     RET
  1275. ;-----------------------------------------------------------------------------
  1276. ; Effect 8 -- Set PANNING
  1277. ;-----------------------------------------------------------------------------
  1278. Go_PANNING:
  1279.     MOV    [MPANNING+SI],AL
  1280.     RET
  1281. ;-----------------------------------------------------------------------------
  1282. ; Effect 9 -- Retrig Note
  1283. ;-----------------------------------------------------------------------------
  1284. Go_RetrigNote:
  1285.     MOV    BL,AL
  1286.     OR    BL,BL
  1287.     JZ    SHORT Go_rtnend
  1288.     MOVZX    AX,MT_COUNTER
  1289.     OR    AL,AL
  1290.     JNZ    SHORT Go_rtnskp
  1291.     CMP    [NOTE+DI],0
  1292.     JNE    SHORT Go_rtnskp
  1293.     MOV    MT_COUNTER,0
  1294. Go_rtnskp:
  1295.     DIV    BL
  1296.     XCHG    AL,AH
  1297.     OR    AL,AL
  1298.     JNZ    SHORT Go_rtnend
  1299. Go_DoRetrig:
  1300.     XOR    AX,AX
  1301.     MOV    [MOFS+DI],AX
  1302.     MOV    [MOFLOW+SI],AX
  1303.     MOV    AX,[LENGTHI+DI]
  1304.     MOV    [MMAXREP+DI],AX
  1305.     MOV    AX,[LOOPSTART+DI]
  1306.     MOV    [MREPEAT+DI],AX
  1307.     ADD    AX,[REPLEN+DI]
  1308.     MOV    [MREPLEN+DI],AX
  1309. Go_rtnend:
  1310.     RET
  1311. ;-----------------------------------------------------------------------------
  1312. ; Effect A -- Volume Fine Up
  1313. ;-----------------------------------------------------------------------------
  1314. Go_VolumeFineUp:
  1315.     CMP    MT_COUNTER,0
  1316.     JNE    Go_Return
  1317.     JMP    Go_VolSlideUp
  1318. ;-----------------------------------------------------------------------------
  1319. ; Effect B -- Volume Fine Down
  1320. ;-----------------------------------------------------------------------------
  1321. Go_VolumeFineDown:
  1322.     CMP    MT_COUNTER,0
  1323.     JNZ    Go_Return
  1324.     JMP    Go_VolSlideDown2
  1325. ;-----------------------------------------------------------------------------
  1326. ; Effect C -- Note Cut
  1327. ;-----------------------------------------------------------------------------
  1328. Go_NoteCut:
  1329.     CMP    AL,MT_COUNTER
  1330.     JNE    Go_Return
  1331.     MOV    [VOLUME+SI],0
  1332.     MOV    [MVOL+SI],AL
  1333.     RET
  1334. ;-----------------------------------------------------------------------------
  1335. ; Effect D -- Note Delay
  1336. ;-----------------------------------------------------------------------------
  1337. Go_NoteDelay:
  1338.     CMP    AL,MT_COUNTER
  1339.     JNE    Go_Return
  1340.     CMP    [NOTE+DI],0
  1341.     JE    Go_Return
  1342.     JMP    Go_DoRetrig
  1343. ;-----------------------------------------------------------------------------
  1344. ; Effect E -- Pattern Delay
  1345. ;-----------------------------------------------------------------------------
  1346. Go_PatternDelay:
  1347.     CMP    MT_COUNTER,0
  1348.     JNE    Go_Return
  1349.     CMP    MT_PATTDELAYTIME2,0
  1350.     JNZ    Go_Return
  1351.     INC    AL
  1352.     MOV    MT_PATTDELAYTIME,AL
  1353.     RET
  1354. ;-----------------------------------------------------------------------------
  1355. ; Effect F -- Funk It
  1356. ;-----------------------------------------------------------------------------
  1357. Go_E_Commands ENDP
  1358. ;=============================================================================
  1359.  
  1360.  
  1361. ;=============================================================================
  1362. MIXUP_CHANNELS PROC NEAR
  1363.     CMP    MOD_STAT,3        ;MOD HAS FINISHED
  1364.     JB    SHORT GMX7
  1365.     XOR    AX,AX
  1366.     XOR    BX,BX
  1367.     MOV    CX,MAX_CHAN_NUMB
  1368. LMX4:    MOV    [MSEG+BX],AX
  1369.     INC    BX
  1370.     INC    BX
  1371.     LOOP    LMX4
  1372. GMX7:    MOV    CX,DMA_CX
  1373.     CMP    MOD_STAT,2
  1374.     JB    SHORT GMX3
  1375.     MOVZX    SI,DMA_CHANNEL
  1376.     MOVZX    DX,[DMA_FLIP+SI]
  1377.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  1378.     MOVZX    DX,[DMA_ADR+SI]
  1379.     IN    AL,DX            ;GET DMA POSITION
  1380.     XCHG    AL,AH
  1381.     IN    AL,DX
  1382.     XCHG    AL,AH
  1383.     SUB    AX,DMA_POFF        ;AX IS OFFSET OF DMA-POS
  1384.     CMP    SI,4
  1385.     JB    SHORT GMX0
  1386.     SHL    AX,1
  1387. GMX0:    AND    AX,0FFFEH
  1388.     ADD    AX,DMA_MORE
  1389.     CMP    AX,DMA_MAX
  1390.     JB    SHORT GMX1
  1391.     SUB    AX,DMA_MAX
  1392. GMX1:    ADD    AX,DMA_OFFSET
  1393.     SUB    AX,DMA_PTR
  1394.     JNC    SHORT GMX2
  1395.     ADD    AX,DMA_MAX
  1396. GMX2:    MOV    CX,AX            ;CX IS NUMBER OF BYTES TO CALCULATE
  1397.     ADD    AX,DMA_PTR
  1398.     SUB    AX,DMA_OFFSET
  1399.     SUB    AX,8000H
  1400.     JC    SHORT GMX3
  1401.     SUB    CX,AX
  1402.  
  1403. GMX3:    CMP    IRQ_REENTER,1        ;OVERLOAD?
  1404.     JA    GMX20
  1405.     XOR    BX,BX
  1406.     XOR    DI,DI
  1407.     CLD
  1408.     SHR    CX,1
  1409.     CMP    DMA_CHANNEL,4
  1410.     JB    SHORT GMX10
  1411.     SHR    CX,1
  1412. GMX10:    CMP    CX,40H
  1413.     JB    GMX5
  1414.     CALL    MIX_CHANNELA
  1415.     INC    BX
  1416.     INC    DI
  1417.     INC    DI
  1418. LMX1:    CALL    MIX_CHANNELM        ;MIX CHANNELS
  1419.     INC    BX
  1420.     INC    DI
  1421.     INC    DI
  1422.     CMP    BX,CH_NUMB
  1423.     JB    LMX1
  1424.     CALL    EMS_SAVE
  1425.     XOR    BX,BX
  1426.     XOR    DI,DI
  1427. LMX2:    CALL    MIX_CHANNELS        ;MIX FX CHANNELS
  1428.     ADD    BX,4
  1429.     INC    DI
  1430.     INC    DI
  1431.     CMP    DI,2*FX_CHAN_NUMB
  1432.     JB    LMX2
  1433.     CALL    EMS_RESTORE
  1434.     MOV    AX,DMA_NEWPTR        ;CHECK DMA-BUFFER OVERFLOW
  1435.     MOV    SI,DMA_MAX        ;ITS A RING BUFFER
  1436.     ADD    SI,DMA_OFFSET
  1437.     CMP    AX,SI
  1438.     JB    SHORT GMX4
  1439.     MOV    CX,AX
  1440.     MOV    DI,DMA_OFFSET
  1441.     SUB    CX,SI
  1442.     JZ    SHORT GMX6
  1443.     CLD
  1444.     SHR    CX,1
  1445.     PUSH    DS
  1446.     MOV    ES,DMA_SEG
  1447.     MOV    DS,DMA_SEG
  1448.     REP MOVSW            ;MOVE OVERFLOW DATA
  1449.     POP    DS
  1450. GMX6:    MOV    AX,DI
  1451. GMX4:    MOV    DMA_PTR,AX        ;START DSP OUTPUT
  1452.     CMP    MOD_STAT,1
  1453.     JNE    SHORT GMX5
  1454.     INC    MOD_STAT
  1455.     CALL    DSP_OUT
  1456.     JMP    SHORT GMX5
  1457. GMX20:    MOV    AX,DMA_NEWPTR        ;IF OVERLOADED JUST CLEAR SOUND
  1458.     SUB    AX,DMA_PTR
  1459.     SUB    CX,AX
  1460.     XOR    AX,AX
  1461.     CLD
  1462.     SHR    CX,1
  1463.     JZ    SHORT GMX5
  1464.     MOV    ES,DMA_SEG
  1465.     MOV    DI,DMA_NEWPTR
  1466.     REP STOSW
  1467.     MOV    DMA_NEWPTR,DI
  1468. GMX5:    RET
  1469. MIXUP_CHANNELS ENDP
  1470. ;-----------------------------------------------------------------------------
  1471. MIX_CHANNELA PROC NEAR
  1472.     PUSH    CX BX DI
  1473.     MOV    AX,[MFIXED+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1474.     MOV    WORD PTR MIXAS4+2,AX
  1475.     MOV    DX,[MFREQ+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1476.     MOV    BYTE PTR MIXAS5+2,DL
  1477.     MOV    WORD PTR MIXAS2,01A72H    ;JB SHORT +26
  1478.     OR    DL,DL
  1479.     JNZ    SHORT MIXA_NOIP
  1480.     MOV    WORD PTR MIXAS2,0C38BH    ;MOV AX,BX
  1481. MIXA_NOIP:
  1482.     MOV    BP,MIXMUL_OFFSET
  1483.     MOV    WORD PTR MIXAS3+2,BP
  1484.     MOV    AL,[MVOL+BX]        ;SAMPLE VOLUME
  1485.     MOV    DL,MUSIC_VOL        ;MASTER VOLUME
  1486.     MOV    BL,[MPANNING+BX]
  1487.     MUL    DL
  1488.     SHL    BX,1
  1489.     MOV    SI,AX
  1490.     MOV    DX,[PANNINGL+BX]
  1491.     MUL    DX
  1492.     SHL    DX,9
  1493.     ADD    DX,BP
  1494.     MOV    WORD PTR MIXAS6+2,DX
  1495.     MOV    AX,SI
  1496.     MOV    DX,[PANNINGR+BX]
  1497.     MUL    DX
  1498.     SHL    DX,9
  1499.     ADD    DX,BP
  1500.     MOV    WORD PTR MIXAS7+2,DX
  1501.     MOV    DX,[MOFLOW+DI]        ;ACTUAL AFTER FIXED POINT VALUE
  1502.     MOV    SI,[MOFS+DI]        ;GET OFFSET IN SAMPLE (START=0)
  1503.     MOV    ES,[MSEG+DI]
  1504.     MOV    AX,[MMAXREP+DI]        ;OFFSET OF SAMPLE ENDING
  1505.     DEC    AX
  1506.     MOV    WORD PTR MIXAS1+2,AX
  1507.     JMP    SHORT CLEAR_PREF1    ;CLEAR PREFETCH QUEUE!!!
  1508. CLEAR_PREF1:
  1509.     MOV    DI,DMA_PTR
  1510.     MOV    DS,DMA_SEG        ;DS:DI IS DMA-BUFFER POINTER
  1511.     MOV    AX,ES
  1512.     OR    AX,AX
  1513.     JZ    SHORT SILENTA_FILL
  1514. MIXA_LOOP:
  1515. MIXAS1:    CMP    SI,0F000H        ;SMCODE FOR SAMPLE END
  1516.     JAE    SHORT RESTA_FILL
  1517.     MOV    BX,ES:[SI]        ;GET SAMPLE BYTES
  1518.     XCHG    BL,BH
  1519.  
  1520. MIXAS2:    MOV    AX,BX            ;SMCODE FOR JB +XX
  1521.     SAR    BL,1            ;BEGIN INTERPOLATION
  1522.     SAR    BH,1
  1523.     XOR    AL,AL
  1524.     SUB    BL,BH
  1525.     MOV    BH,DH
  1526.     SHR    BH,2
  1527.     SHL    BX,1
  1528. MIXAS3:    ADD    BX,0F000H        ;SMCODE FOR MIXMUL TABLE OFFSET
  1529.     MOV    BX,[BX]
  1530.     SAL    BX,2
  1531.     ADD    BX,AX            ;END INTERPOLATION
  1532.  
  1533.     SHR    BX,7            ;CALCULATE VOLUMES
  1534.     AND    BX,0000000111111110B
  1535. MIXAS4:    ADD    DX,0F000H        ;SMCODE FOR FIXED POINT
  1536. MIXAS5:    ADC    SI,0            ;SMCODE FOR SAMPLE POINTER
  1537. MIXAS6:    MOV    AX,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET LEFT
  1538. MIXAS7:    MOV    BP,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET RIGHT
  1539. MOVA1:    MOV    [DI],AX            ;SMCODE
  1540.     MOV    BX,BP
  1541.     INC    DI
  1542. NOP1:    INC    DI            ;SMCODE
  1543. MOVB1:    MOV    [DI],BX            ;SMCODE
  1544.     INC    DI
  1545. NOP2:    INC    DI            ;SMCODE
  1546.     LOOP    MIXA_LOOP
  1547. MIXA_END:
  1548.     MOV    AX,CS
  1549.     MOV    DS,AX
  1550.     MOV    AX,ES
  1551.     MOV    DMA_NEWPTR,DI
  1552.     POP    DI BX CX
  1553.     MOV    [MSEG+DI],AX
  1554.     MOV    [MOFLOW+DI],DX
  1555.     MOV    [MOFS+DI],SI
  1556.     RET
  1557. RESTA_FILL:
  1558.     POP    BP
  1559.     PUSH    BP
  1560.     MOV    AX,CS:[MREPLEN+BP]
  1561.     OR    AX,AX
  1562.     JZ    SHORT SILENTA_FILL
  1563.     MOV    CS:[MMAXREP+BP],AX
  1564.     DEC    AX
  1565.     MOV    WORD PTR CS:MIXAS1+2,AX
  1566.     MOV    SI,CS:[MREPEAT+BP]
  1567.     JMP    MIXA_LOOP
  1568. SILENTA_FILL:
  1569.     MOV    BX,DS
  1570.     MOV    ES,BX
  1571.     CMP    CS:DMA_CHANNEL,4
  1572.     JB    SHORT NOT16BITA
  1573.     SHL    CX,1
  1574. NOT16BITA:
  1575.     REP STOSW
  1576.     MOV    ES,AX
  1577.     JMP    MIXA_END
  1578. MIX_CHANNELA ENDP
  1579. ;-----------------------------------------------------------------------------
  1580. MIX_CHANNELM PROC NEAR
  1581.     PUSH    CX BX DI
  1582.     MOV    AX,[MFIXED+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1583.     MOV    WORD PTR MIXMS4+2,AX
  1584.     MOV    DX,[MFREQ+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1585.     MOV    BYTE PTR MIXMS5+2,DL
  1586.     MOV    WORD PTR MIXMS2,01A72H    ;JB SHORT +26
  1587.     OR    DL,DL
  1588.     JNZ    SHORT MIXM_NOIP
  1589.     MOV    WORD PTR MIXMS2,0C38BH    ;MOV AX,BX
  1590. MIXM_NOIP:
  1591.     MOV    BP,MIXMUL_OFFSET
  1592.     MOV    WORD PTR MIXMS3+2,BP
  1593.     MOV    AL,[MVOL+BX]        ;SAMPLE VOLUME
  1594.     MOV    DL,MUSIC_VOL        ;MASTER VOLUME
  1595.     MOV    BL,[MPANNING+BX]
  1596.     MUL    DL
  1597.     SHL    BX,1
  1598.     MOV    SI,AX
  1599.     MOV    DX,[PANNINGL+BX]
  1600.     MUL    DX
  1601.     SHL    DX,9
  1602.     ADD    DX,BP
  1603.     MOV    WORD PTR MIXMS6+2,DX
  1604.     MOV    AX,SI
  1605.     MOV    DX,[PANNINGR+BX]
  1606.     MUL    DX
  1607.     SHL    DX,9
  1608.     ADD    DX,BP
  1609.     MOV    WORD PTR MIXMS7+2,DX
  1610.     MOV    DX,[MOFLOW+DI]        ;ACTUAL AFTER FIXED POINT VALUE
  1611.     MOV    SI,[MOFS+DI]        ;GET OFFSET IN SAMPLE (START=0)
  1612.     MOV    ES,[MSEG+DI]
  1613.     MOV    AX,[MMAXREP+DI]        ;OFFSET OF SAMPLE ENDING
  1614.     DEC    AX
  1615.     MOV    WORD PTR MIXMS1+2,AX
  1616.     JMP    SHORT CLEAR_PREF2    ;CLEAR PREFETCH QUEUE!!!
  1617. CLEAR_PREF2:
  1618.     MOV    DI,DMA_PTR
  1619.     MOV    DS,DMA_SEG        ;DS:DI IS DMA-BUFFER POINTER
  1620.     MOV    AX,ES
  1621.     OR    AX,AX
  1622.     JZ    SHORT MIXM_END
  1623. MIXM_LOOP:
  1624. MIXMS1:    CMP    SI,0F000H        ;SMCODE FOR SAMPLE END
  1625.     JAE    SHORT RESTM_FILL
  1626.     MOV    BX,ES:[SI]        ;GET SAMPLE BYTES
  1627.     XCHG    BL,BH
  1628.  
  1629. MIXMS2:    MOV    AX,BX            ;SMCODE FOR JB +XX
  1630.     SAR    BL,1            ;BEGIN INTERPOLATION
  1631.     SAR    BH,1
  1632.     XOR    AL,AL
  1633.     SUB    BL,BH
  1634.     MOV    BH,DH
  1635.     SHR    BH,2
  1636.     SHL    BX,1
  1637. MIXMS3:    ADD    BX,0F000H        ;SMCODE FOR MIXMUL TABLE OFFSET
  1638.     MOV    BX,[BX]
  1639.     SAL    BX,2
  1640.     ADD    BX,AX            ;END INTERPOLATION
  1641.  
  1642.     SHR    BX,7            ;CALCULATE VOLUMES
  1643.     AND    BX,0000000111111110B
  1644. MIXMS4:    ADD    DX,0F000H        ;SMCODE FOR FIXED POINT
  1645. MIXMS5:    ADC    SI,0            ;SMCODE FOR SAMPLE POINTER
  1646. MIXMS6:    MOV    AX,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET LEFT
  1647. MIXMS7:    MOV    BP,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET RIGHT
  1648. ADDA2:    ADD    [DI],AX            ;SMCODE
  1649.     JNO    SHORT MIXMG1
  1650.     SHR    AX,15
  1651.     ADD    AX,7FFFH
  1652. MOVA2:    MOV    [DI],AX            ;SMCODE
  1653. MIXMG1:    MOV    BX,BP
  1654.     INC    DI
  1655. NOP3:    INC    DI            ;SMCODE
  1656. ADDB2:    ADD    [DI],BX            ;SMCODE
  1657.     JNO    SHORT MIXMG2
  1658.     SHR    BX,15
  1659.     ADD    BX,7FFFH
  1660. MOVB2:    MOV    [DI],BX            ;SMCODE
  1661. MIXMG2:    INC    DI
  1662. NOP4:    INC    DI            ;SMCODE
  1663.     LOOP    MIXM_LOOP
  1664. MIXM_END:
  1665.     MOV    AX,CS
  1666.     MOV    DS,AX
  1667.     MOV    AX,ES
  1668.     POP    DI BX CX
  1669.     MOV    [MSEG+DI],AX
  1670.     MOV    [MOFLOW+DI],DX
  1671.     MOV    [MOFS+DI],SI
  1672.     RET
  1673. RESTM_FILL:
  1674.     POP    BP
  1675.     PUSH    BP
  1676.     MOV    AX,CS:[MREPLEN+BP]
  1677.     OR    AX,AX
  1678.     JZ    SHORT SILENTM_FILL
  1679.     MOV    CS:[MMAXREP+BP],AX
  1680.     DEC    AX
  1681.     MOV    WORD PTR CS:MIXMS1+2,AX
  1682.     MOV    SI,CS:[MREPEAT+BP]
  1683.     JMP    MIXM_LOOP
  1684. SILENTM_FILL:
  1685.     MOV    ES,AX
  1686.     JMP    MIXM_END
  1687. MIX_CHANNELM ENDP
  1688. ;-----------------------------------------------------------------------------
  1689. MIX_CHANNELS PROC NEAR
  1690.     CMP    [SAM_SEG+DI],0
  1691.     JE    GO_BACKS
  1692.     PUSH    EAX
  1693.     MOV    EAX,[SAM_OFS+BX]
  1694.     CALL    EMS_PAGING
  1695.     POP    EAX
  1696.     PUSH    SI CX BX DI
  1697.     MOV    AX,[SAM_FIX+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1698.     MOV    WORD PTR MIXSS4+2,AX
  1699.     MOV    DX,[SAM_FRQ+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1700.     MOV    BYTE PTR MIXSS5+2,DL
  1701.     MOVZX    AX,FX_VOL        ;MASTER VOLUME
  1702.     MOV    BX,[SAM_PAN+DI]
  1703.     SHL    AX,6
  1704.     SHL    BX,1
  1705.     MOV    BP,AX
  1706.     MOV    DX,[PANNINGL+BX]
  1707.     MUL    DX
  1708.     SHL    DX,9
  1709.     ADD    DX,MIXMUL_OFFSET
  1710.     MOV    WORD PTR MIXSS6+2,DX
  1711.     MOV    AX,BP
  1712.     MOV    DX,[PANNINGR+BX]
  1713.     MUL    DX
  1714.     SHL    DX,9
  1715.     ADD    DX,MIXMUL_OFFSET
  1716.     MOV    WORD PTR MIXSS7+2,DX
  1717.     MOV    DX,[SAM_OFL+DI]        ;ACTUAL AFTER FIXED POINT VALUE
  1718.     MOV    AX,SI            ;OFFSET OF SAMPLE ENDING
  1719.     ADD    AX,[SAM_MAX+DI]
  1720.     JNC    SHORT MIXSG3
  1721.     XOR    AX,AX
  1722.     DEC    AX
  1723. MIXSG3:    MOV    WORD PTR MIXSS1+2,AX
  1724.     JMP    SHORT CLEAR_PREF3    ;CLEAR PREFETCH QUEUE!!!
  1725. CLEAR_PREF3:
  1726.     MOV    DI,DMA_PTR
  1727.     MOV    DS,DMA_SEG        ;DS:DI IS DMA-BUFFER POINTER
  1728. MIXS_LOOP:
  1729. MIXSS1:    CMP    SI,0F000H        ;SMCODE FOR SAMPLE END
  1730.     JAE    SHORT RESTS_FILL
  1731.     MOV    BL,ES:[SI]        ;GET SAMPLE BYTES
  1732.     XOR    BH,BH
  1733.     SHL    BX,1            ;CALCULATE VOLUMES
  1734. MIXSS4:    ADD    DX,0F000H        ;SMCODE FOR FIXED POINT
  1735. MIXSS5:    ADC    SI,0            ;SMCODE FOR SAMPLE POINTER
  1736. MIXSS6:    MOV    AX,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET LEFT
  1737. MIXSS7:    MOV    BP,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET RIGHT
  1738. ADDA3:    ADD    [DI],AX            ;SMCODE
  1739.     JNO    SHORT MIXSG1
  1740.     SHR    AX,15
  1741.     ADD    AX,7FFFH
  1742. MOVA3:    MOV    [DI],AX            ;SMCODE
  1743. MIXSG1:    MOV    BX,BP
  1744.     INC    DI
  1745. NOP5:    INC    DI            ;SMCODE
  1746. ADDB3:    ADD    [DI],BX            ;SMCODE
  1747.     JNO    SHORT MIXSG2
  1748.     SHR    BX,15
  1749.     ADD    BX,7FFFH
  1750. MOVB3:    MOV    [DI],BX            ;SMCODE
  1751. MIXSG2:    INC    DI
  1752. NOP6:    INC    DI            ;SMCODE
  1753.     LOOP    MIXS_LOOP
  1754. MIXS_END:
  1755.     MOV    AX,CS
  1756.     MOV    DS,AX
  1757.     POP    DI BX CX AX
  1758.     MOV    [SAM_OFL+DI],DX
  1759.     SUB    SI,AX
  1760.     PUSH    EAX
  1761.     MOVZX    EAX,SI
  1762.     ADD    [SAM_OFS+BX],EAX
  1763.     SUB    [SAM_MAX+DI],AX
  1764.     JZ    SHORT MIXS_SAMPEND
  1765.     JNC    SHORT MIXS_SAMPOK
  1766. MIXS_SAMPEND:
  1767.     MOV    [SAM_SEG+DI],0
  1768. MIXS_SAMPOK:
  1769.     POP    EAX
  1770. GO_BACKS:
  1771.     RET
  1772. RESTS_FILL:
  1773.     POP    DI
  1774.     PUSH    DI
  1775.     MOV    CS:[SAM_SEG+DI],0
  1776.     JMP    MIXS_END
  1777. MIX_CHANNELS ENDP
  1778. ;-----------------------------------------------------------------------------
  1779. ; SET EMS-PAGES
  1780. ; IN:  EAX= EMS-OFFSET
  1781. ; OUT: ES:SI= SEGMENT & OFFSET IN EMS PAGE
  1782. ;-----------------------------------------------------------------------------
  1783. EMS_PAGING PROC NEAR
  1784.     MOV    SI,AX
  1785.     AND    SI,3FFFH
  1786.     MOV    ES,EMS_SEG
  1787.     PUSHA
  1788.     PUSH    EAX
  1789.     SHR    EAX,14
  1790.     MOV    BX,AX
  1791.     XOR    AL,AL
  1792.     MOV    DX,EMS_HANDLE
  1793.     MOV    AH,44H
  1794.     INT    67H
  1795.     INC    AL
  1796.     INC    BX
  1797.     MOV    AH,44H
  1798.     INT    67H
  1799.     INC    AL
  1800.     INC    BX
  1801.     MOV    AH,44H
  1802.     INT    67H
  1803.     INC    AL
  1804.     INC    BX
  1805.     MOV    AH,44H
  1806.     INT    67H
  1807.     POP    EAX
  1808.     POPA
  1809.     RET
  1810. EMS_PAGING ENDP
  1811. ;-----------------------------------------------------------------------------
  1812. EMS_SAVE PROC NEAR
  1813.     PUSH    AX DX
  1814.     MOV    DX,EMS_HANDLE        ;EMS MAPPING SICHERN
  1815.     MOV    AH,47H
  1816.     INT    67H
  1817.     POP    DX AX
  1818.     RET
  1819. EMS_SAVE ENDP
  1820. ;-----------------------------------------------------------------------------
  1821. EMS_RESTORE PROC NEAR
  1822.     PUSH    AX DX
  1823.     MOV    DX,EMS_HANDLE        ;EMS MAPPING ZURÜCKSETZEN
  1824.     MOV    AH,48H
  1825.     INT    67H
  1826.     POP    DX AX
  1827.     RET
  1828. EMS_RESTORE ENDP
  1829. ;╒═══════════════════════════════════════════════════════════════════════════╕
  1830. ;│ DESCRIPTION: Calculates the values for the mixing multiplication table.   │
  1831. ;│              This table is used during 4/8-channel mixing to speed up the │
  1832. ;│              operation by avoiding 'mul' instructions.                    │
  1833. ;╘═══════════════════════════════════════════════════════════════════════════╛
  1834. MAKE_MIXMUL_VOLUMETABLE PROC NEAR
  1835.     MOV    ES,DMA_SEG
  1836.     MOV    DI,MIXMUL_OFFSET
  1837.     CLD
  1838.     XOR    BX,BX            ; start with volume 0
  1839.     INC    BH
  1840. VOLUMELOOP:                ; start with sample 0
  1841. SAMPLELOOP:
  1842.     MOV    AL,BL
  1843.     IMUL    BH
  1844.     SAL    AX,1
  1845.     CMP    BH,1
  1846.     JA    SHORT GMK1
  1847.     XOR    AX,AX
  1848. GMK1:    STOSW
  1849.     INC    BL
  1850.     JNZ    SAMPLELOOP
  1851.     INC    BH
  1852.     CMP    BH,64
  1853.     JBE    VOLUMELOOP
  1854.     RET
  1855. MAKE_MIXMUL_VOLUMETABLE ENDP
  1856. ;=============================================================================
  1857.  
  1858.  
  1859. ;=============================================================================
  1860. ;
  1861. ; DOS ROUTINEN
  1862. ;
  1863. ;=============================================================================
  1864. ;-----------------------------------------------------------------------------
  1865. ; TIMER-IRQ-HANDLER: 1024 HZ CALLING FREQUENCE
  1866. ;-----------------------------------------------------------------------------
  1867. TIMER_HANDLER PROC FAR
  1868.     PUSH    AX
  1869.     CMP    CS:SYSTEM,0
  1870.     JNE    SHORT WT6
  1871.     MOV    AL,UHR_STATC
  1872.     OUT    UHR_INDEX,AL
  1873.     JMP    SHORT WT1
  1874. WT1:    JMP    SHORT WT2
  1875. WT2:    IN    AL,UHR_PORT
  1876.     MOV    AL,20H
  1877.     OUT    IRQ3,AL
  1878. WT6:    MOV     AL,20H
  1879.     OUT    IRQ1,AL
  1880.     STI
  1881.     CMP    CS:MOD_STAT,0
  1882.     JE    SHORT WT3
  1883.     MOV    AX,WORD PTR CS:[BPM_SPEED+2]    ;1024/20.48 = 50 HZ
  1884.     ADD    WORD PTR CS:[BPM_COUNT+2],AX
  1885.     MOV    AX,WORD PTR CS:[BPM_SPEED]
  1886.     ADC    WORD PTR CS:[BPM_COUNT],AX
  1887.     JNC    SHORT WT3
  1888.     PUSHA
  1889.     PUSH    DS ES CS
  1890.     POP    DS
  1891.     INC    IRQ_REENTER
  1892.     CALL    CONTROL_CHANNELS
  1893. ;    MOV    AH,7
  1894. ;    CALL    RASTER_COL
  1895.     CALL    MIXUP_CHANNELS
  1896. ;    MOV    AH,0
  1897. ;    CALL    RASTER_COL
  1898.     TEST    SB_MODUS,2
  1899.     JZ    SHORT WT5
  1900.     MOV    MOD_STAT,4
  1901.     JMP    SHORT WT4
  1902. WT5:    CMP    MOD_STAT,4
  1903.     JB    SHORT WT4
  1904.     MOV    MOD_STAT,2
  1905. WT4:    DEC    IRQ_REENTER
  1906.     POP    ES DS
  1907.     POPA
  1908. WT3:    POP    AX
  1909.     CMP    CS:VAR_BUFSEG,0
  1910.     JNE    SHORT WT8
  1911.     CMP    CS:SYSTEM,0
  1912.     JE    SHORT WT7
  1913.     DEC    CS:IRQCOUNT
  1914.     JNZ    SHORT WT7
  1915.     MOV    CS:IRQCOUNT,56
  1916. WT8:    JMP    DWORD PTR CS:[HOLD70]
  1917. WT7:    IRET
  1918. TIMER_HANDLER ENDP
  1919. ;-----------------------------------------------------------------------------
  1920. ; SOUNDBLASTER-IRQ-HANDLER
  1921. ;-----------------------------------------------------------------------------
  1922. SBIRQ_HANDLER PROC FAR
  1923.     PUSH    AX DX
  1924.     MOV    DX,CS:SB_RSTAT        ;CLEAR 8 BIT IRQ
  1925.     CMP    CS:DMA_CHANNEL,4
  1926.     JB    SHORT GSBI2
  1927.     INC    DX            ;CLEAR 16 BIT IRQ
  1928. GSBI2:    IN    AL,DX
  1929.     MOV    AL,20H
  1930.     CMP    CS:IRQ_NUMBER,8
  1931.     JB    SHORT GSBI1
  1932.     OUT    IRQ3,AL
  1933. GSBI1:    OUT    IRQ1,AL
  1934.     POP    DX AX
  1935.     IRET
  1936. SBIRQ_HANDLER ENDP
  1937. ;-----------------------------------------------------------------------------
  1938. ; SERVICE IRQ UMLEITUNG; USES THE REAL-TIME-CLOCK IRQ
  1939. ;-----------------------------------------------------------------------------
  1940. IRQ_INIT PROC NEAR
  1941.     CLI
  1942.     XOR     AX,AX
  1943.     MOV     ES,AX
  1944.     CMP    SYSTEM,0
  1945.     JNE    WU11
  1946.     MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  1947.     MOV     DX,COMP_SPEED3
  1948.     MOV     COMP_SPEED2,DX
  1949.     MOV     COMP_SPEED3,AX
  1950.     CMP    VAR_BUFSEG,0
  1951.     JNE    SHORT WU13
  1952.     MOV    AL,UHR_STATA        ;UHR-IRQ-RATE EINSTELLEN (1024 HZ)
  1953.     OUT    UHR_INDEX,AL
  1954.     JMP    SHORT WU1
  1955. WU1:    JMP    SHORT WU2
  1956. WU2:    XCHG    AL,AH
  1957.     IN    AL,UHR_PORT
  1958.     AND    AL,0F0H
  1959.     OR    AL,DL
  1960.     XCHG    AL,AH
  1961.     OUT    UHR_INDEX,AL
  1962.     JMP    SHORT WU3
  1963. WU3:    JMP    SHORT WU4
  1964. WU4:    XCHG    AL,AH
  1965.     OUT    UHR_PORT,AL
  1966.     JMP    SHORT WU5
  1967. WU5:    JMP    SHORT WU6
  1968. WU6:    MOV    AL,UHR_STATB        ;UHR-IRQ-MODUS EINSTELLEN
  1969.     OUT    UHR_INDEX,AL
  1970.     JMP    SHORT WU7
  1971. WU7:    JMP    SHORT WU8
  1972. WU8:    XCHG    AL,AH
  1973.     IN    AL,UHR_PORT
  1974.     AND    AL,08FH
  1975.     MOV    DL,DH
  1976.     AND    DL,40H
  1977.     OR    AL,DL
  1978.     XCHG    AL,AH
  1979.     OUT    UHR_INDEX,AL
  1980.     JMP    SHORT WU9
  1981. WU9:    JMP    SHORT WU10
  1982. WU10:    XCHG    AL,AH
  1983.     OUT    UHR_PORT,AL
  1984.     IN    AL,IRQ4            ;IRQ8 DE-/MASKIEREN
  1985.     AND    AL,0FEH
  1986.     MOV    DL,DH
  1987.     AND    DL,1
  1988.     OR    AL,DL
  1989.     OUT    IRQ4,AL
  1990. WU13:    MOV    DL,DH
  1991.     AND    DL,1
  1992.     MOV    CL,IRQ_NUMBER
  1993.     CMP    CL,8
  1994.     JAE    SHORT WU20
  1995.     IN    AL,IRQ2            ;SBIRQ 0-7 DE-/MASKIEREN
  1996.     SHL    DL,CL
  1997.     MOV    DH,0FEH
  1998.     ROL    DH,CL
  1999.     AND    AL,DH
  2000.     OR    AL,DL
  2001.     OUT    IRQ2,AL
  2002.     JMP    SHORT WU21
  2003. WU20:    SUB    CL,8            ;SBIRQ 8-15 DE-/MASKIEREN
  2004.     IN    AL,IRQ4
  2005.     SHL    DL,CL
  2006.     MOV    DH,0FEH
  2007.     ROL    DH,CL
  2008.     AND    AL,DH
  2009.     OR    AL,DL
  2010.     OUT    IRQ4,AL
  2011. WU21:    MOV     BX,4*70H                ;UHR-IRQ VERBIEGEN
  2012.     MOV     EAX,ES:[BX]
  2013.     MOV     EDX,HOLD70
  2014.     MOV     ES:[BX],EDX
  2015.     MOV     HOLD70,EAX
  2016.     JMP    WU12
  2017. WU11:    CMP    VAR_BUFSEG,0
  2018.     JNE    SHORT WU14
  2019.     MOV     AX,COMP_SPEED4        ;FOR WINDOWS
  2020.     MOV     DX,COMP_SPEED5
  2021.     MOV     COMP_SPEED4,DX
  2022.     MOV     COMP_SPEED5,AX
  2023.     MOV     AL,00110110B            ;TIMER0 AUF 1.024 KHZ EINSTELLEN
  2024.     OUT     PIT1,AL                 ;TEILER=1193
  2025.     MOV     AL,DL
  2026.     OUT     TIMER0,AL
  2027.     JMP     SHORT OUT40
  2028. OUT40:  MOV     AL,DH
  2029.     OUT     TIMER0,AL
  2030. WU14:    MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  2031.     MOV     DX,COMP_SPEED3
  2032.     MOV     COMP_SPEED2,DX
  2033.     MOV     COMP_SPEED3,AX
  2034.     MOV    DL,DH
  2035.     AND    DL,1
  2036.     MOV    CL,IRQ_NUMBER
  2037.     CMP    CL,8
  2038.     JAE    SHORT WU30
  2039.     IN    AL,IRQ2            ;SBIRQ 0-7 DE-/MASKIEREN
  2040.     SHL    DL,CL
  2041.     MOV    DH,0FEH
  2042.     ROL    DH,CL
  2043.     AND    AL,DH
  2044.     OR    AL,DL
  2045.     OUT    IRQ2,AL
  2046.     JMP    SHORT WU31
  2047. WU30:    SUB    CL,8
  2048.     IN    AL,IRQ4            ;SBIRQ 8-15 DE-/MASKIEREN
  2049.     SHL    DL,CL
  2050.     MOV    DH,0FEH
  2051.     ROL    DH,CL
  2052.     AND    AL,DH
  2053.     OR    AL,DL
  2054.     OUT    IRQ4,AL
  2055. WU31:    MOV     BX,4*8H                 ;TIMEOUT-IRQ VERBIEGEN
  2056.     MOV     EAX,ES:[BX]
  2057.     MOV     EDX,HOLD70
  2058.     MOV     ES:[BX],EDX
  2059.     MOV     HOLD70,EAX
  2060. WU12:    MOVZX    BX,CL            ;SOUNDBLASTER-IRQ VERBIEGEN
  2061.     ADD    BX,08H
  2062.     CMP    IRQ_NUMBER,8
  2063.     JB    SHORT WU40
  2064.     ADD    BX,68H
  2065. WU40:    SHL    BX,2
  2066.     MOV     EAX,ES:[BX]
  2067.     MOV     EDX,HOLDSB
  2068.     MOV     ES:[BX],EDX
  2069.     MOV     HOLDSB,EAX
  2070.     MOV    AL,20H
  2071.     OUT    IRQ3,AL
  2072.     OUT    IRQ1,AL
  2073.     STI
  2074.     RET
  2075. IRQ_INIT ENDP
  2076. ;----------------------------------------------------------------------------
  2077. ; RESERVIERT SPEICHER FÜR TRACKS, CARRY-FLAG 0=OK 1=ABBRUCH
  2078. ;----------------------------------------------------------------------------
  2079. SET_TMEM PROC NEAR
  2080.     XOR    SI,SI
  2081.     XOR    AX,AX            ;CHECK FOR EMS-MANAGER
  2082.     MOV    ES,AX
  2083.     MOV    TRACK_HANDLE,AX
  2084.     MOV    AX,ES:[4*67H+2]
  2085.     MOV    ES,AX
  2086.     CMP    ES:[10],"XMME"
  2087.     JNE    SHORT STCM1
  2088.     CMP    ES:[14],"0XXX"
  2089.     JNE    SHORT STCM1
  2090.     MOV    AH,42H
  2091.     INT    67H
  2092.     OR    AH,AH
  2093.     JNZ    SHORT STCM1
  2094.     CMP    BX,4
  2095.     JB    SHORT STCM1
  2096.     MOV    AH,41H
  2097.     INT    67H
  2098.     MOV    TRACK_SEG,BX
  2099.     MOV    AH,43H            ;ALLOCATE 64K EMS FOR TRACK BUFFER
  2100.     MOV    BX,4
  2101.     INT    67H
  2102.     MOV    TRACK_HANDLE,DX
  2103.     MOV    AH,48H
  2104.     MOV    BX,80H            ;2K PATTERN BUFFER
  2105.     INT    21H
  2106.     JC    SHORT STCM1
  2107.     MOV    PATTERN_SEG,AX
  2108.     CLC
  2109.     RET
  2110. STCM1:    STC
  2111.     RET
  2112. SET_TMEM ENDP
  2113. ;----------------------------------------------------------------------------
  2114. ; GIBT SPEICHER VON TRACKS WIEDER FREI
  2115. ;----------------------------------------------------------------------------
  2116. FREE_TMEM PROC NEAR
  2117.     MOV    AX,SAMPLE_SEG
  2118.     MOV    ES,AX
  2119.     MOV    AH,49H
  2120.     INT    21H
  2121.     CMP    TRACK_SEG,0
  2122.     JE    SHORT GFTM1
  2123.     MOV    AH,45H
  2124.     MOV    DX,TRACK_HANDLE
  2125.     INT    67H
  2126.     MOV    TRACK_SEG,0
  2127. GFTM1:    RET
  2128. FREE_TMEM ENDP
  2129. ;-----------------------------------------------------------------------------
  2130. ; SET TRACK-PAGES
  2131. ;-----------------------------------------------------------------------------
  2132. TRACK_PAGING PROC NEAR
  2133.     PUSHA
  2134.     XOR    BX,BX
  2135.     XOR    AL,AL
  2136.     MOV    DX,TRACK_HANDLE
  2137.     MOV    AH,44H
  2138.     INT    67H
  2139.     INC    AL
  2140.     INC    BX
  2141.     MOV    AH,44H
  2142.     INT    67H
  2143.     INC    AL
  2144.     INC    BX
  2145.     MOV    AH,44H
  2146.     INT    67H
  2147.     INC    AL
  2148.     INC    BX
  2149.     MOV    AH,44H
  2150.     INT    67H
  2151.     POPA
  2152.     RET
  2153. TRACK_PAGING ENDP
  2154. ;-----------------------------------------------------------------------------
  2155. TRACK_SAVE PROC NEAR
  2156.     PUSH    AX DX
  2157.     MOV    DX,TRACK_HANDLE        ;EMS MAPPING SICHERN
  2158.     MOV    AH,47H
  2159.     INT    67H
  2160.     POP    DX AX
  2161.     RET
  2162. TRACK_SAVE ENDP
  2163. ;-----------------------------------------------------------------------------
  2164. TRACK_RESTORE PROC NEAR
  2165.     PUSH    AX DX
  2166.     MOV    DX,TRACK_HANDLE        ;EMS MAPPING ZURÜCKSETZEN
  2167.     MOV    AH,48H
  2168.     INT    67H
  2169.     POP    DX AX
  2170.     RET
  2171. TRACK_RESTORE ENDP
  2172. ;----------------------------------------------------------------------------
  2173. ; RESERVIERT SPEICHER FÜR DMA_BUFFER & MIXMUL_TABLE, CARRY 0=OK 1=ABBRUCH
  2174. ;----------------------------------------------------------------------------
  2175. SET_DMEM PROC NEAR
  2176.     MOV     AH,48H
  2177.     MOV     BX,1000H                ;64K BUFFER
  2178.     INT     21H
  2179.     JC      SHORT SDCM1
  2180.     MOV     DMA_SEG,AX
  2181.     MOV    DMA_OFFSET,0        ;DMA_BUFFER CA.  8K
  2182.     MOV    MIXMUL_OFFSET,8000H    ;MIXMUL_TAB CA. 16K
  2183.     AND    AX,0FFFH        ;ES IST DARAUF ZU ACHTEN, DASS
  2184.     CMP    AX,0800H        ;DER DMA_BUFFER VOLLSTÄNDIG IN
  2185.     JBE    SHORT SDCM2        ;EINER PAGE LIEGT
  2186.     MOV    DMA_OFFSET,8000H
  2187.     MOV    MIXMUL_OFFSET,0
  2188. SDCM2:    CLC
  2189. SDCM1:  RET
  2190. SET_DMEM ENDP
  2191. ;----------------------------------------------------------------------------
  2192. ; GIBT SPEICHER VON DMA & MIXMUL_VOLUMETABLE WIEDER FREI
  2193. ;----------------------------------------------------------------------------
  2194. FREE_DMEM PROC NEAR
  2195.     MOV    ES,DMA_SEG
  2196.     MOV    AH,49H
  2197.     INT    21H
  2198.     RET
  2199. FREE_DMEM ENDP
  2200. ;-----------------------------------------------------------------------------
  2201. FREE_MEM PROC NEAR
  2202.     MOV     BX,PROG_END_SEG         ;SPEICHER FREI MACHEN
  2203.     SUB     BX,PROG_START_SEG
  2204.     MOV     ES,PROG_START_SEG
  2205.     MOV     AH,4AH                  ;SPEICHERBLOCKGRÖSSE ÄNDERN
  2206.     INT     21H
  2207.     RET
  2208. FREE_MEM ENDP
  2209. ;=============================================================================
  2210.  
  2211.  
  2212. ;=============================================================================
  2213. ;
  2214. ; SOUNDBLASTER HARDWARE ROUTINEN
  2215. ;
  2216. ;=============================================================================
  2217. ; SET MIXER
  2218. ;-----------------------------------------------------------------------------
  2219. MIXER_INIT PROC NEAR
  2220.     MOV    DX,SBP_MIXERI
  2221.     MOV    AL,3CH
  2222.     OUT    DX,AL
  2223.     INC    DX
  2224.     IN    AL,DX
  2225.     OR    AL,00011110B        ;ENABLE CD L/R IN,LINE L/R IN
  2226.     OUT    DX,AL
  2227.     DEC    DX
  2228.     MOV    AL,30H
  2229.     OUT    DX,AL
  2230.     INC    DX
  2231.     MOV    AL,255            ;MAX MASTERVOLUME L
  2232.     OUT    DX,AL
  2233.     DEC    DX
  2234.     MOV    AL,31H
  2235.     OUT    DX,AL
  2236.     INC    DX
  2237.     MOV    AL,255            ;MAX MASTERVOLUME R
  2238.     OUT    DX,AL
  2239.     DEC    DX
  2240.     MOV    AL,32H
  2241.     OUT    DX,AL
  2242.     INC    DX
  2243.     MOV    AL,255            ;MAX DSPVOLUME L
  2244.     OUT    DX,AL
  2245.     DEC    DX
  2246.     MOV    AL,33H
  2247.     OUT    DX,AL
  2248.     INC    DX
  2249.     MOV    AL,255            ;MAX DSPVOLUME R
  2250.     OUT    DX,AL
  2251.     DEC    DX
  2252.     MOV    AL,0EH
  2253.     OUT    DX,AL
  2254.     INC    DX
  2255.     MOV    AL,2H            ;FILTER & STEREO
  2256.     OUT    DX,AL
  2257.     RET
  2258. MIXER_INIT ENDP
  2259. ;-----------------------------------------------------------------------------
  2260. ; SET DMA READY FOR TRANSFER WITH AUTOINIT
  2261. ; IN: DX:BX= BLOCKPOINTER, CX= SIZE
  2262. ;-----------------------------------------------------------------------------
  2263. DMA_INIT PROC NEAR
  2264.     CLI
  2265.     MOV    AX,DX            ;ADRESSE IN PAGE UND OFFSET UMRECHNEN
  2266.     SHL    DX,4
  2267.     SHR    AH,4            ;PAGE
  2268.     ADD    BX,DX            ;OFFSET NEU
  2269.     ADC    AH,0
  2270.     MOV    AL,AH
  2271.     MOVZX    SI,DMA_CHANNEL
  2272.     CMP    SI,4
  2273.     JB    SHORT GDMI1
  2274.     SHR    CX,1
  2275.     SHRD    BX,AX,1            ;ADRESSE FÜR 16-BIT DMA
  2276. GDMI1:    MOV    DMA_POFF,BX
  2277.     DEC    CX            ;DMA SIZE= BLOCK SIZE -1
  2278.     MOVZX    DX,[DMA_MASK+SI]
  2279.     MOV    AL,DMA_CHANNEL
  2280.     OR    AL,4
  2281.     OUT    DX,AL            ;DMA-KANAL MASKIEREN
  2282.     MOVZX    DX,[DMA_MOD+SI]
  2283.     AND    AL,3
  2284.     OR    AL,01011000B
  2285.     OUT    DX,AL            ;DMA-MODUS FÜR SB
  2286.     MOVZX    DX,[DMA_FLIP+SI]
  2287.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  2288.     MOVZX    DX,[DMA_ADR+SI]
  2289.     MOV    AL,BL            ;DMA CHANNEL 1-4
  2290.     OUT    DX,AL            ;OFFSET LOW
  2291.     MOV    AL,BH
  2292.     OUT    DX,AL            ;OFFSET HIGH
  2293.     MOVZX    DX,[DMA_CNT+SI]
  2294.     MOV    AL,CL
  2295.     OUT    DX,AL            ;SIZE LOW
  2296.     MOV    AL,CH
  2297.     OUT    DX,AL            ;SIZE HIGH
  2298.     MOVZX    DX,[DMA_PAGE+SI]
  2299.     MOV    AL,AH
  2300.     OUT    DX,AL            ;PAGE
  2301.     MOVZX    DX,[DMA_MASK+SI]
  2302.     MOV    AX,SI
  2303.     AND    AL,3
  2304.     OUT    DX,AL            ;DMA-KANAL DEMASKIEREN
  2305.     STI
  2306.     RET
  2307. DMA_INIT ENDP
  2308. ;-----------------------------------------------------------------------------
  2309. ; DSP SET SAMPLE RATE
  2310. ;-----------------------------------------------------------------------------
  2311. DSP_RATE PROC NEAR
  2312.     MOV    AH,41H
  2313.     CALL    DSP_WRITE
  2314.     MOV    AX,SAMPLE_RATE
  2315.     CALL    DSP_WRITE
  2316.     MOV    AX,SAMPLE_RATE
  2317.     MOV    AH,AL
  2318.     CALL    DSP_WRITE
  2319.     RET
  2320. DSP_RATE ENDP
  2321. ;-----------------------------------------------------------------------------
  2322. ; DSP OUT BLOCK
  2323. ;-----------------------------------------------------------------------------
  2324. DSP_OUT PROC NEAR
  2325.     CALL    DSP_RATE
  2326.     MOV    AH,0C6H            ;8 BIT OUTPUT, AUTOINIT PCM
  2327.     CMP    DMA_CHANNEL,4
  2328.     JB    SHORT GDSPO1
  2329.     MOV    AH,0B6H            ;16 BIT OUTPUT, AUTOINIT PCM
  2330. GDSPO1:    CALL    DSP_WRITE
  2331.     MOV    AH,30H            ;STEREO SIGNED!
  2332.     CALL    DSP_WRITE
  2333.     MOV    AH,0F0H            ;SIZE LOW
  2334.     CALL    DSP_WRITE
  2335.     MOV    AH,0FFH            ;SIZE HIGH
  2336.     CALL    DSP_WRITE
  2337.     RET
  2338. DSP_OUT ENDP
  2339. ;-----------------------------------------------------------------------------
  2340. ; DSP RESET
  2341. ; OUT: CARRY 1= FAILURE
  2342. ;-----------------------------------------------------------------------------
  2343. DSP_RESET PROC NEAR
  2344.     CALL    DSP_OFF
  2345.     MOVZX    SI,DMA_CHANNEL
  2346.     MOVZX    DX,[DMA_MASK+SI]
  2347.     MOV    AL,DMA_CHANNEL
  2348.     OR    AL,4
  2349.     OUT    DX,AL            ;DMA-KANAL MASKIEREN
  2350.     CALL    MIXER_INIT
  2351.     MOV    DX,SB_RESET
  2352.     MOV    AL,1
  2353.     OUT    DX,AL            ;SEND RESET COMMAND
  2354.     MOV    CX,4
  2355.     CALL    WAIT_TIME        ;WAIT
  2356.     XOR    AL,AL
  2357.     OUT    DX,AL            ;CLEAR RESET COMMAND
  2358.     MOV    CX,120
  2359.     CALL    WAIT_TIME        ;WAIT
  2360.     MOV    DX,SB_RSTAT
  2361.     IN    AL,DX            ;CHECK IF SUCCESSFUL
  2362.     OR    AL,AL
  2363.     JNS    SHORT GDRES1
  2364.     MOV    DX,SB_READ
  2365.     IN    AL,DX
  2366.     CMP    AL,0AAH
  2367.     JNE    SHORT GDRES1
  2368.     CALL    DSP_ON
  2369.     CLC                ;RESET OK
  2370.     RET
  2371. GDRES1:    STC                ;RESET FAILURE
  2372.     RET
  2373. DSP_RESET ENDP
  2374. ;-----------------------------------------------------------------------------
  2375. ; LAUTSPRECHER EIN
  2376. ;-----------------------------------------------------------------------------
  2377. DSP_ON PROC NEAR
  2378.     MOV    AH,0D1H            ;SPEAKER ON
  2379.     CALL    DSP_WRITE
  2380.     MOV    CX,120
  2381.     CALL    WAIT_TIME        ;WAIT
  2382.     RET
  2383. DSP_ON ENDP
  2384. ;-----------------------------------------------------------------------------
  2385. ; LAUTSPRECHER AUS
  2386. ;-----------------------------------------------------------------------------
  2387. DSP_OFF PROC NEAR
  2388.     PUSH    CS
  2389.     POP    DS
  2390.     MOV    DX,SBP_MIXERI        ;SB16
  2391.     CMP    LOADMOD_FLAG,0
  2392.     JNE    SHORT GDSPF1
  2393.     MOV    AL,30H            ;AUSGEBAUT WEGEN CD UNTERBRECHUNG
  2394.     OUT    DX,AL
  2395.     INC    DX
  2396.     MOV    AL,0            ;MIN MASTERVOLUME L
  2397.     OUT    DX,AL
  2398.     DEC    DX
  2399.     MOV    AL,31H
  2400.     OUT    DX,AL
  2401.     INC    DX
  2402.     MOV    AL,0            ;MIN MASTERVOLUME R
  2403.     OUT    DX,AL
  2404.     DEC    DX
  2405. GDSPF1:    MOV    AL,32H
  2406.     OUT    DX,AL
  2407.     INC    DX
  2408.     MOV    AL,0            ;MIN DSPVOLUME L
  2409.     OUT    DX,AL
  2410.     DEC    DX
  2411.     MOV    AL,33H
  2412.     OUT    DX,AL
  2413.     INC    DX
  2414.     MOV    AL,0            ;MIN DSPVOLUME R
  2415.     OUT    DX,AL
  2416.     MOV    CX,240
  2417.     CALL    WAIT_TIME
  2418.     MOV    DX,SB_RESET
  2419.     MOV    AL,1
  2420.     OUT    DX,AL            ;SEND RESET COMMAND
  2421.     MOV    CX,4
  2422.     CALL    WAIT_TIME        ;WAIT
  2423.     XOR    AL,AL
  2424.     OUT    DX,AL            ;CLEAR RESET COMMAND
  2425.     MOV    CX,120
  2426.     CALL    WAIT_TIME
  2427.     MOV    AH,0D3H            ;DSP OFF
  2428.     CALL    DSP_WRITE
  2429.     MOV    CX,240
  2430.     CALL    WAIT_TIME
  2431.     RET
  2432. DSP_OFF ENDP
  2433. ;-----------------------------------------------------------------------------
  2434. ; READ BYTE
  2435. ; OUT: AL= BYTE
  2436. ;-----------------------------------------------------------------------------
  2437. DSP_READ PROC NEAR
  2438.     MOV    DX,SB_READ
  2439.     MOV    CX,-1            ;FAIL SAFE
  2440. LDRD1:    IN    AL,DX
  2441.     CMP    AL,0AAH
  2442.     JNE    SHORT LDRD2
  2443.     LOOP    LDRD1
  2444. LDRD2:    RET
  2445. DSP_READ ENDP
  2446. ;-----------------------------------------------------------------------------
  2447. ; WRITE BYTE
  2448. ; IN: AH= BYTE
  2449. ;-----------------------------------------------------------------------------
  2450. DSP_WRITE PROC NEAR
  2451.     MOV    DX,SB_WRITE
  2452.     MOV    CX,1000H        ;FAIL SAFE
  2453. LDWR1:    IN    AL,DX
  2454.     OR    AL,AL
  2455.     JNS    SHORT LDWR2
  2456.     LOOP    LDWR1
  2457. LDWR2:    MOV    AL,AH
  2458.     OUT    DX,AL
  2459.     RET
  2460. DSP_WRITE ENDP
  2461. ;-----------------------------------------------------------------------------
  2462. ; WAIT TIME
  2463. ; CX = XXX MILLISECONDS
  2464. ;-----------------------------------------------------------------------------
  2465. WAIT_TIME PROC NEAR
  2466.     PUSH    AX BX EDX
  2467. LWT1:    IN    AL,TIMER0
  2468.     MOV    BL,AL
  2469.     IN    AL,TIMER0
  2470.     MOV    BH,AL
  2471.     MOV    EDX,500000        ;FAIL SAFE
  2472. LWT2:    IN    AL,TIMER0        ;1 MILLISEC WARTEN
  2473.     XCHG    AL,AH
  2474.     IN    AL,TIMER0
  2475.     XCHG    AL,AH
  2476.     SUB    AX,BX
  2477.     NEG    AX
  2478.     DEC    EDX
  2479.     JZ    SHORT LWT3
  2480.     CMP    AX,1193
  2481.     JB    LWT2
  2482. LWT3:    LOOP    LWT1
  2483.     POP    EDX BX AX
  2484.     RET
  2485. WAIT_TIME ENDP
  2486. ;=============================================================================
  2487.  
  2488.  
  2489. ;=============================================================================
  2490. ;
  2491. ; MOD LADEROUTINEN
  2492. ;
  2493. ;=============================================================================
  2494. ; LÄDT EIN MODFILE
  2495. ; DS:DX= FILENAME
  2496. ;-----------------------------------------------------------------------------
  2497. LOAD_MOD PROC NEAR
  2498.     MOV    AX,3D00H        ;OPEN MOD
  2499.     INT    21H
  2500.     JC    GLDM1
  2501.     PUSH    CS
  2502.     POP    DS
  2503.     MOV    GDDHANDLE,AX
  2504. GLDM0:    CALL    SET_DMEM        ;ALLOCATE DMA-BUFFER 
  2505.     CALL    SET_TMEM        ;ALLOCATE TRACK-BUFFER
  2506.     CALL    TRACK_PAGING        ;GET TRACKS INTO EMS PAGES
  2507.     MOV    BX,GDDHANDLE
  2508.     MOV    GDDZEIG,0
  2509.     CMP    LOADMOD_FLAG,0
  2510.     JNE    GLDM99
  2511.     MOV    CX,10            ;SONG-NAME HOLEN
  2512. LLDM1:    CALL    GET_QUEUE
  2513.     JC    GLDM2
  2514.     LOOP    LLDM1
  2515.     MOV    SAMPLE_SIZE,0
  2516.     XOR    SI,SI            ;31 INSTRUMENTS
  2517. LLDM2:    MOV    AX,SAMPLE_SIZE
  2518.     MOV    [SAMPLE_SEG+SI],AX
  2519.     MOV    CX,11            ;INSTRUMENT NAME
  2520. LLDM3:    CALL    GET_QUEUE    
  2521.     JC    GLDM2
  2522.     LOOP    LLDM3
  2523.     XOR    EAX,EAX
  2524.     CALL    GET_QUEUE        ;INSTRUMENT SIZE
  2525.     XCHG    AL,AH
  2526.     CMP    AX,2
  2527.     JAE    SHORT GLDM20
  2528.     XOR    AX,AX
  2529. GLDM20:    SHL    AX,1
  2530.     MOV    [ISIZE+SI],AX        ;HÖCHSTENS 64K
  2531.     OR    EAX,EAX
  2532.     JZ    SHORT GLDM9
  2533.     SHR    EAX,4
  2534.     INC    AX
  2535.     ADD    SAMPLE_SIZE,AX
  2536. GLDM9:    CALL    GET_QUEUE        ;IVOLUME & FINETUNE
  2537.     XCHG    AL,AH
  2538.     MOV    [IVOL_FINETUNE+SI],AX
  2539.     CALL    GET_QUEUE        ;ILOOP_START
  2540.     XCHG    AL,AH
  2541.     SHL    AX,1
  2542.     MOV    [ILOOP_START+SI],AX
  2543.     CALL    GET_QUEUE        ;ILOOP_SIZE
  2544.     XCHG    AL,AH
  2545.     SHL    AX,1
  2546.     MOV    [ILOOP_SIZE+SI],AX
  2547.     INC    SI
  2548.     INC    SI
  2549.     CMP    SI,62
  2550.     JB    LLDM2
  2551.     CALL    GET_QUEUE        ;SONG_SIZE & LOOP_BYTE OR NOTHING
  2552.     JC    GLDM2
  2553.     MOV    SONG_SIZE,AL
  2554.     MOV    SONG_LOOP,AH
  2555.     XOR    DX,DX
  2556.     MOV    CX,64            ;SONG_DATA
  2557.     MOV    DI,OFFSET SONG_DATA
  2558. LLDM4:    CALL    GET_QUEUE
  2559.     JC    GLDM2
  2560.     MOV    [DI],AX
  2561.     CMP    AL,DL            ;FIND HIGHEST PATTERN NUMBER
  2562.     JBE    SHORT GLDM12
  2563.     MOV    DL,AL
  2564. GLDM12:    CMP    AH,DL
  2565.     JBE    SHORT GLDM13
  2566.     MOV    DL,AH
  2567. GLDM13:    INC    DI
  2568.     INC    DI
  2569.     LOOP    LLDM4
  2570.     INC    DL
  2571.     CLD
  2572.     MOV    PATTERN_NUMBER,DX
  2573.     CALL    GET_QUEUE
  2574.     PUSH    AX
  2575.     CALL    GET_QUEUE
  2576.     SHL    EAX,16
  2577.     POP    AX
  2578.     MOV    MOD_SIGN,EAX
  2579.     CMP    EAX,"NHC8"        ;8CHN-MOD
  2580.     JE    SHORT GLDM3
  2581.     CMP    EAX,"8TLF"        ;FLT8-MOD
  2582.     JE    SHORT GLDM3
  2583.     CMP    EAX,".K.M"        ;M.K.-MOD
  2584.     JE    SHORT GLDM10
  2585.     CMP    EAX,"4TLF"        ;FLT4-MOD
  2586.     JNE    GLDM2
  2587.  
  2588. GLDM10:    MOV    CH_NUMB,4        ;4-CHANNEL-MOD
  2589.     MOV    PATTERN_SIZE,1024
  2590.     MOV    AH,0
  2591.     MOV    TRACK_INFO+4,AH
  2592.     MOV    TRACK_INFO+5,AH
  2593.     MOV    TRACK_INFO+6,AH
  2594.     MOV    TRACK_INFO+7,AH
  2595.     JMP    SHORT GLDM11
  2596. GLDM3:    MOV    CH_NUMB,8        ;8-CHANNEL-MOD: GET-PATTERNS
  2597.     MOV    PATTERN_SIZE,2048
  2598. GLDM11:    MOV    PATTERN_CURRENT,0
  2599.     MOV    TRACK_NUMBER,0
  2600. LLDM7:    MOV    ES,PATTERN_SEG
  2601.     MOV    BX,GDDHANDLE
  2602.     XOR    DI,DI
  2603. LLDM6:    XOR    SI,SI
  2604. LLDM5:    CALL    GET_QUEUE        ;PATTERN HOLEN UND IN TRACKS AUFSPALTEN
  2605.     JC    GLDM2
  2606.     MOV    DX,AX
  2607.     CALL    GET_QUEUE
  2608.     JC    GLDM2
  2609.     ROL    AL,4            ;MODIFY PATTERN DATA
  2610.     MOV    CL,AL            ;LOOK AT PROTRACKER-CODE HEADER
  2611.     AND    AL,0FH
  2612.     AND    CL,0F0H    
  2613.     MOV    CH,DL
  2614.     AND    DL,0FH
  2615.     AND    CH,0F0H
  2616.     OR    AL,CH
  2617.     OR    DL,CL
  2618.     XCHG    DL,DH
  2619.     PUSH    DI
  2620.     ADD    DI,SI
  2621.     SHL    EAX,16
  2622.     MOV    AX,DX
  2623.     STOSD
  2624.     POP    DI
  2625.     ADD    SI,256
  2626.     CMP    SI,PATTERN_SIZE        ;NEXT TRACK/CHANNEL
  2627.     JB    LLDM5
  2628.     ADD    DI,4            ;NEXT NOTE
  2629.     CMP    DI,256
  2630.     JB    LLDM6
  2631.     CALL    SET_FREQUENCIES
  2632.     MOV    ES,TRACK_SEG        ;TRACK1-8 INTEGRIEREN
  2633.     MOV    DX,TRACK_NUMBER
  2634.     XCHG    DL,DH
  2635.     MOV    DS,PATTERN_SEG
  2636.     XOR    SI,SI
  2637.     XOR    BX,BX
  2638. LLDM8:    XOR    DI,DI
  2639. LLDM9:    CMP    DX,DI
  2640.     JBE    SHORT GLDM4
  2641.     PUSH    SI DI
  2642.     MOV    CX,256/4
  2643.     REPE CMPSD            ;TRACK ALREADY EXISTS?
  2644.     POP    DI SI
  2645.     PUSHF
  2646.     ADD    DI,256
  2647.     POPF
  2648.     JNE    LLDM9
  2649.     JMP    SHORT GLDM5
  2650. GLDM4:    INC    DH            ;NO, ADD TRACK TO BUFFER
  2651.     PUSH    SI
  2652.     MOV    CX,256/4
  2653.     REP MOVSD
  2654.     POP    SI
  2655. GLDM5:    MOV    AX,DI            ;YES
  2656.     DEC    AH
  2657.     MOV    CS:[TRACK_INFO+BX],AH
  2658.     INC    BX
  2659.     ADD    SI,256
  2660.     CMP    BX,CS:CH_NUMB
  2661.     JB    LLDM8
  2662.     PUSH    CS
  2663.     POP    DS
  2664.     XCHG    DL,DH
  2665.     MOV    TRACK_NUMBER,DX
  2666.     XOR    BX,BX            ;TRACKLISTE NACHFÜHREN
  2667.     MOV    AX,PATTERN_CURRENT
  2668. LLDM10:    CMP    [SONG_DATA+BX],AL
  2669.     JNE    SHORT GLDM6
  2670.     MOV    AH,TRACK_INFO
  2671.     MOV    [TRACK1_DATA+BX],AH
  2672.     MOV    AH,TRACK_INFO+1
  2673.     MOV    [TRACK2_DATA+BX],AH
  2674.     MOV    AH,TRACK_INFO+2
  2675.     MOV    [TRACK3_DATA+BX],AH
  2676.     MOV    AH,TRACK_INFO+3
  2677.     MOV    [TRACK4_DATA+BX],AH
  2678.     MOV    AH,TRACK_INFO+4
  2679.     MOV    [TRACK5_DATA+BX],AH
  2680.     MOV    AH,TRACK_INFO+5
  2681.     MOV    [TRACK6_DATA+BX],AH
  2682.     MOV    AH,TRACK_INFO+6
  2683.     MOV    [TRACK7_DATA+BX],AH
  2684.     MOV    AH,TRACK_INFO+7
  2685.     MOV    [TRACK8_DATA+BX],AH
  2686. GLDM6:    INC    BX
  2687.     CMP    BL,128
  2688.     JB    LLDM10
  2689.     INC    PATTERN_CURRENT        ;NÄCHSTES PATTERN HOLEN
  2690.     MOV    AX,PATTERN_CURRENT
  2691.     CMP    AX,PATTERN_NUMBER
  2692.     JB    LLDM7
  2693.     JMP    SHORT GLDM7
  2694.  
  2695. GLDM99:    CMP    TRACK_SEG,0        ;TRACK SEGMENT WIEDER LÖSCHEN
  2696.     JE    SHORT GLDM7
  2697.     MOV    AH,45H
  2698.     MOV    DX,TRACK_HANDLE
  2699.     INT    67H
  2700.     MOV    TRACK_SEG,0
  2701. GLDM7:    MOV    ES,PATTERN_SEG        ;PATTERN SEGMENT WIEDER LÖSCHEN
  2702.     MOV    AH,49H
  2703.     INT    21H
  2704.     CMP    LOADMOD_FLAG,0
  2705.     JNE    SHORT GLDM98
  2706.     MOV    BX,SAMPLE_SIZE        ;SAMPLE SEGMENT ALLOKIEREN 
  2707.     MOV    AH,48H
  2708.     INT    21H
  2709.     XOR    BX,BX
  2710. LLDM11:    ADD    [SAMPLE_SEG+BX],AX
  2711.     INC    BX
  2712.     INC    BX
  2713.     CMP    BX,62
  2714.     JB    LLDM11
  2715.     MOV    BX,GDDHANDLE
  2716.     XOR    SI,SI            ;SAMPLES LADEN
  2717. LLDM12:    MOV    CX,[ISIZE+SI]
  2718.     MOV    ES,[SAMPLE_SEG+SI]
  2719.     XOR    DI,DI
  2720.     SHR    CX,1
  2721.     JCXZ    SHORT GLDM8
  2722. LLDM13:    CALL    GET_QUEUE
  2723.     STOSW
  2724.     LOOP    LLDM13
  2725. GLDM8:    INC    SI
  2726.     INC    SI
  2727.     CMP    SI,62
  2728.     JB    LLDM12
  2729. GLDM98:    CLC
  2730.     JMP    SHORT GLDM15
  2731. GLDM2:    STC
  2732. GLDM15:    PUSHF
  2733.     CMP    VAR_BUFSEG,0
  2734.     JNE    SHORT GLDM16
  2735.     MOV    AH,3EH
  2736.     INT    21H
  2737. GLDM16:    POPF
  2738. GLDM1:    RET
  2739. LOAD_MOD ENDP
  2740. ;-----------------------------------------------------------------------------
  2741. ; ERSETZT DIE MEISTEN FREQUENZ-PERIODEN DURCH DEN TABELLEN-INDEX
  2742. ;-----------------------------------------------------------------------------
  2743. SET_FREQUENCIES PROC NEAR
  2744.     XOR    DI,DI
  2745. SET_FREQ1:
  2746.     MOV    AX,ES:[DI]        ;get fx
  2747.     MOV    DX,AX
  2748.     SHR    AH,4
  2749.     CMP    AH,3
  2750.     JE    SHORT SET_FREQ4
  2751.     CMP    AH,5
  2752.     JE    SHORT SET_FREQ4
  2753.     MOV    AX,DX
  2754.     AND    AX,0FFFH        ; Mask out unwanted bits.
  2755.     JZ    SHORT SET_FREQ4
  2756.     XOR    BX,BX
  2757.     MOV    CX,48            ; 36 periods to cycle through.
  2758. SET_FREQ2:
  2759.     CMP    AX,[MT_PERIODTABLE+BX]    ; Check the note against the period.
  2760.     JAE    SHORT SET_FREQ3        ; We found it!
  2761.     INC    BX            ; Otherwise, update the pointer and
  2762.     INC    BX
  2763.     LOOP    SET_FREQ2        ; keep looping.
  2764. SET_FREQ3:
  2765.     MOV    AX,DX            ;recall the Note Value
  2766.     AND    AX,0F000H        ;just keep fx
  2767.     INC    BX
  2768.     OR    AX,BX            ;put in the new offset
  2769.     STOSW                ;store it
  2770.     DEC    DI
  2771.     DEC    DI
  2772. SET_FREQ4:
  2773.     ADD    DI,4            ;and go to next channel
  2774.     CMP    DI,PATTERN_SIZE
  2775.     JB    SET_FREQ1
  2776.     RET
  2777. SET_FREQUENCIES ENDP
  2778. ;-----------------------------------------------------------------------------
  2779. ; HOLT EIN WORD AUS DEM BUFFER
  2780. ; IN: AX= WORD, BX= HANDLE
  2781. ;-----------------------------------------------------------------------------
  2782. GET_QUEUE PROC NEAR
  2783.     CMP     GDDZEIG,0
  2784.     JNE     SHORT GTQ1
  2785.     PUSH    CX DX
  2786.     MOV     DX,OFFSET QUEUE_BUFFER
  2787.     MOV     CX,256
  2788.     MOV     AH,3FH
  2789.     INT     21H
  2790.     MOV    GDDREST,AX
  2791.     POP    DX CX
  2792. GTQ1:   PUSH    BX
  2793.     MOV     BL,GDDZEIG
  2794.     XOR     BH,BH
  2795.     CMP    BX,GDDREST
  2796.     JAE    SHORT GTQ2
  2797.     MOV     AX,[QUEUE_BUFFER+BX]
  2798.     ADD     GDDZEIG,2
  2799.     POP    BX
  2800.     CLC
  2801.     RET
  2802. GTQ2:    POP    BX
  2803.     STC
  2804.     RET
  2805. GET_QUEUE ENDP
  2806. ;=============================================================================
  2807. ; LÄDT EIN SAMPLE
  2808. ; INPUT: DS:DX= FILENAME, CL= 00H AMIGA-SAMPLE, 80H PC-SAMPLE
  2809. ; OUTPUT: AX= SAMPLE-HANDLE FOR PLAYING
  2810. ;-----------------------------------------------------------------------------
  2811. LOAD_SAMPLE PROC NEAR
  2812.     MOV    AX,3D00H        ;OPEN SAMPLE
  2813.     INT    21H
  2814.     JC    GSMP1
  2815.     PUSH    CS
  2816.     POP    DS
  2817.     MOV    GDDHANDLE,AX
  2818.     MOV    BX,AX
  2819.     PUSH    CX
  2820.     CALL    GET_FILESIZE
  2821.     POP    CX
  2822. GSMP0:    AND    CL,80H
  2823.     MOV    SAM_FLAG1,CL
  2824.     MOV    GDDZEIG,0
  2825.     MOV    CX,AX
  2826.     AND    CX,0FFFEH
  2827.     SHR    AX,4
  2828.     INC    AX
  2829.     MOV    BX,AX
  2830.     CMP    EMS_SEG,0
  2831.     JNE    SHORT GSMP3
  2832.     PUSHA
  2833.     XOR    SI,SI
  2834.     XOR    AX,AX            ;CHECK FOR EMS-MANAGER
  2835.     MOV    ES,AX
  2836.     MOV    EMS_HANDLE,AX
  2837.     MOV    AX,ES:[4*67H+2]
  2838.     MOV    ES,AX
  2839.     CMP    ES:[10],"XMME"
  2840.     JNE    GSMP2
  2841.     CMP    ES:[14],"0XXX"
  2842.     JNE    GSMP2
  2843.     MOV    AH,42H
  2844.     INT    67H
  2845.     OR    AH,AH
  2846.     JNZ    GSMP2
  2847.     CMP    BX,37
  2848.     JB    GSMP2
  2849.     MOV    AH,41H
  2850.     INT    67H
  2851.     MOV    EMS_SEG,BX
  2852.     MOV    AH,43H            ;ALLOCATE 592K EMS FOR FX
  2853.     MOV    BX,37
  2854.     INT    67H
  2855.     MOV    EMS_HANDLE,DX
  2856.     XOR    AX,AX
  2857.     MOV    EMS_OFFSET,AX
  2858.     MOV    SAMPLE_ZEIG,AX
  2859.     POPA
  2860. GSMP3:    MOV    AX,EMS_OFFSET
  2861.     MOV    SI,SAMPLE_ZEIG
  2862.     MOV    [SAMPLE_MEM+SI],AX
  2863.     MOV    [SAMPLE_BIG+SI],CX
  2864.     ADD    SAMPLE_ZEIG,2
  2865.     MOV    DI,CX
  2866.     SHR    DI,4
  2867.     INC    DI
  2868.     ADD    EMS_OFFSET,DI
  2869.     XOR    DI,DI
  2870.     CLD
  2871.     INC    CX
  2872.     SHR    CX,1
  2873.     MOV    DL,SAM_FLAG1
  2874.     MOV    DH,DL
  2875.     AND    EAX,0FFFFH
  2876.     SHL    EAX,4
  2877. LSMP1:    PUSH    EAX SI
  2878.     OR    DI,DI
  2879.     JNZ    SHORT GSMP4
  2880.     CALL    EMS_PAGING
  2881.     MOV    DI,SI
  2882. GSMP4:    MOV    BX,GDDHANDLE
  2883.     CALL    GET_QUEUE
  2884.     XOR    AX,DX
  2885.     STOSW
  2886.     POP    SI EAX
  2887.     INC    EAX
  2888.     INC    EAX
  2889.     LOOP    LSMP1
  2890.     CLC
  2891.     PUSHA
  2892. GSMP2:    POPA
  2893.     PUSHF
  2894.     CMP    VAR_BUFSEG,0
  2895.     JNE    SHORT GSMP5
  2896.     MOV    BX,GDDHANDLE
  2897.     MOV    AH,3EH
  2898.     INT    21H
  2899. GSMP5:    MOV    AX,SI
  2900.     POPF
  2901. GSMP1:    RET
  2902. LOAD_SAMPLE ENDP
  2903. ;-----------------------------------------------------------------------------
  2904. GET_FILESIZE PROC NEAR
  2905.     MOV    AX,4202H
  2906.     XOR    CX,CX
  2907.     XOR    DX,DX
  2908.     INT    21H
  2909.     PUSH    AX
  2910.     MOV    AX,4200H
  2911.     XOR    CX,CX
  2912.     XOR    DX,DX
  2913.     INT    21H
  2914.     POP    AX
  2915.     RET
  2916. GET_FILESIZE ENDP
  2917. ;=============================================================================
  2918. ; LOAD CONFIG DATA (PARSER)
  2919. ; IN: CX=0C242H, DS:BX= POINTER TO PARAM-BLOCK
  2920. ;
  2921. ; PARAM-BLOCK:     + 0 BASE PORT        210H-280H, 388H, ETC.
  2922. ;                  + 2 DMA NUMBER        0-7
  2923. ;                  + 3 IRQ NUMBER        0-15
  2924. ;        + 4 SAMPLE RATE        10000-44100
  2925. ;               + 6 INTERNAL TYPE       0,1,2,3,... (if necessary)
  2926. ;        + 7 INTERRUPT TYPE      0,1 (realtime clock, timer)
  2927. ;               + 8 STARTING POSITION   0-127
  2928. ;               + 9 LOOP POSITION    0-127,128
  2929. ;               +10 SONG MODUS        0-3
  2930. ;               +11 START MASTER VOLUME 0-255
  2931. ;        +12 START MUSIC VOLUME    0-255
  2932. ;               +13 START FX VOLUME     0-255
  2933. ;-----------------------------------------------------------------------------
  2934. CONFIG_INIT PROC NEAR
  2935.     MOV    DX,DS
  2936.     MOV    AX,CS
  2937.     MOV    DS,AX
  2938.     MOV    WORD PTR HOLD70+2,AX
  2939.     MOV    WORD PTR HOLDSB+2,AX
  2940.     CMP    CX,0C242H
  2941.     JNE    SHORT NORMAL_CONFIG
  2942.     MOV    ES,DX
  2943.     MOV    AX,ES:[BX]
  2944.     ADD    AL,4
  2945.     MOV    SBP_MIXERI,AX
  2946.     INC    AX
  2947.     MOV    SBP_MIXERD,AX
  2948.     INC    AX
  2949.     MOV    SB_RESET,AX
  2950.     ADD    AX,4
  2951.     MOV    SB_READ,AX
  2952.     ADD    AX,2
  2953.     MOV    SB_WRITE,AX
  2954.     ADD    AX,2
  2955.     MOV    SB_RSTAT,AX
  2956.     MOV    AL,ES:[BX+2]
  2957.     AND    AL,7
  2958.     MOV    DMA_CHANNEL,AL
  2959.     MOV    AL,ES:[BX+3]
  2960.     AND    AL,15
  2961.     MOV    IRQ_NUMBER,AL
  2962.     MOV    AX,ES:[BX+4]
  2963.     MOV    SAMPLE_RATE,AX
  2964.     MOV    AL,ES:[BX+7]
  2965.     AND     AL,1
  2966.     MOV     SYSTEM,AL
  2967.     MOV    AL,ES:[BX+8]
  2968.     AND    AL,127
  2969.     MOV    SONG_START,AL
  2970.     MOV    AL,ES:[BX+9]
  2971.     MOV    SONG_LOOP,AL
  2972.     MOV    AL,ES:[BX+10]
  2973.     AND     AL,3
  2974.     MOV    SB_MODUS,AL
  2975.     MOV    AL,ES:[BX+11]
  2976.     MOV    BX,ES:[BX+12]
  2977.     CALL    SET_VOLUME
  2978.     JMP    CONT_CONFIG
  2979. NORMAL_CONFIG:
  2980.     MOV     DX,OFFSET CONFIG_NAME
  2981.     MOV     AH,3DH
  2982.     MOV     AL,80H
  2983.     INT     21H
  2984.     JC      GCFG1
  2985.     MOV     GDDHANDLE,AX
  2986. LCFG1:  XOR     SI,SI
  2987.     MOV     DX,OFFSET QUEUE_BUFFER
  2988. LCFG2:  MOV     AH,3FH
  2989.     MOV     BX,GDDHANDLE
  2990.     MOV     CX,1
  2991.     INT     21H
  2992.     JC      GCFG2
  2993.     OR      AX,AX
  2994.     JZ      GCFG2
  2995.     MOV     DI,DX
  2996.     CMP     BYTE PTR [DI],0AH
  2997.     JE      SHORT GCFG6
  2998.     INC     DX
  2999.     INC     SI
  3000.     CMP     SI,256
  3001.     JB      LCFG2
  3002. GCFG6:    MOV     BX,OFFSET CFG_TEXT2
  3003.     CALL    SEEK_LINE
  3004.     JNC     SHORT GCFG4
  3005.     LODSB
  3006.     AND    AL,1
  3007.     MOV    CD_MIXER,AL
  3008.     LODSB
  3009.     AND     AL,3
  3010.     MOV    SB_MODUS,AL
  3011.     JMP     LCFG1
  3012. GCFG4:  MOV     BX,OFFSET CFG_TEXT3
  3013.     CALL    SEEK_LINE
  3014.     JNC     SHORT GCFG5
  3015.     INC    SI
  3016.     LODSB
  3017.     DEC    AL
  3018.     AND    AL,7
  3019.     INC    AL
  3020.     SHL    AL,4
  3021.     MOV    AH,2
  3022.     ADD    AL,4
  3023.     MOV    SBP_MIXERI,AX
  3024.     INC    AX
  3025.     MOV    SBP_MIXERD,AX
  3026.     INC    AX
  3027.     MOV    SB_RESET,AX
  3028.     ADD    AX,4
  3029.     MOV    SB_READ,AX
  3030.     ADD    AX,2
  3031.     MOV    SB_WRITE,AX
  3032.     ADD    AX,2
  3033.     MOV    SB_RSTAT,AX
  3034.     JMP     LCFG1
  3035. GCFG5:  MOV     BX,OFFSET CFG_TEXT4
  3036.     CALL    SEEK_LINE
  3037.     JNC     SHORT GCFG7
  3038.     LODSW
  3039.     AND     AL,1
  3040.     AND    AH,15
  3041.     MOV    BH,AH
  3042.     MOV    BL,10
  3043.     MUL    BL
  3044.     ADD    AL,BH
  3045.     MOV    IRQ_NUMBER,AL
  3046.     JMP    LCFG1
  3047. GCFG7:  MOV     BX,OFFSET CFG_TEXT5
  3048.     CALL    SEEK_LINE
  3049.     JNC     SHORT GCFG8
  3050.     LODSB
  3051.     AND    AL,7
  3052.     MOV    DMA_CHANNEL,AL
  3053.     JMP    LCFG1
  3054. GCFG8:    MOV    BX,OFFSET CFG_TEXT6
  3055.     CALL    SEEK_LINE
  3056.     JNC    SHORT GCFG9
  3057.     XOR    BX,BX
  3058.     MOV    CX,5
  3059. LCFG3:    MOV    AX,BX
  3060.     MOV    DX,10
  3061.     MUL    DX
  3062.     MOV    BX,AX
  3063.     LODSB
  3064.     AND    AL,0FH
  3065.     XOR    AH,AH
  3066.     ADD    BX,AX
  3067.     LOOP    LCFG3
  3068.     MOV    SAMPLE_RATE,BX
  3069.     JMP     LCFG1
  3070. GCFG9:    MOV     BX,OFFSET CFG_TEXT7
  3071.     CALL    SEEK_LINE
  3072.     JNC     LCFG1
  3073.     LODSB
  3074.     AND     AL,1
  3075.     MOV     SYSTEM,AL
  3076.     JMP     LCFG1
  3077. GCFG2:  MOV     BX,GDDHANDLE
  3078.     MOV     AH,3EH
  3079.     INT     21H
  3080. CONT_CONFIG:
  3081. GCFG1:  RET
  3082. CONFIG_INIT ENDP
  3083. ;-----------------------------------------------------------------------------
  3084. SEEK_LINE PROC NEAR
  3085.     CLD
  3086.     MOV     SI,OFFSET QUEUE_BUFFER
  3087. LSKL1:  PUSH    BX
  3088. LSKL2:  CMP     BYTE PTR [BX],0
  3089.     JE      SHORT GSKL1
  3090.     CMP     SI,DX
  3091.     JAE     SHORT GSKL2
  3092.     LODSB
  3093.     CMP     AL,[BX]
  3094.     JNE     SHORT GSKL3
  3095.     INC     BX      
  3096.     JMP     LSKL2
  3097. GSKL3:  POP     BX
  3098.     JMP     LSKL1
  3099. GSKL2:  POP     BX
  3100.     CLC
  3101.     RET
  3102. GSKL1:  POP     BX
  3103.     STC
  3104.     RET
  3105. SEEK_LINE ENDP
  3106. ;=============================================================================
  3107.  
  3108.  
  3109. ;=============================================================================
  3110. PLAY_MUSIC PROC NEAR
  3111.     PUSH    CS
  3112.     POP    DS
  3113.     MOV    MOD_STAT,0        ;DEACTIVATE IRQ-HANDLING
  3114.     CALL    DSP_RESET
  3115.     JC    GPM1
  3116.     CALL    MAKE_MIXMUL_VOLUMETABLE
  3117.     CALL    IRQ_INIT
  3118.     MOVZX    EBX,SAMPLE_RATE
  3119.     MOV    EDX,36H
  3120.     MOV    EAX,9E940000H        ;1,193,180 * 30000H FOR FREQ CALCS
  3121.     DIV    EBX
  3122.     MOV    MAINFREQ,EAX
  3123.     MOV    CL,DMA_CHANNEL
  3124.     SHR    CL,2
  3125.     MOV    AX,BX
  3126.     XOR    DX,DX
  3127.     MOV    BX,50            ;AMIGA TIMING IS 50HZ (SCREEN-REFRESH)
  3128.     DIV    BX
  3129.     SHL    AX,1            ;STEREO
  3130.     SHL    AX,CL            ;8/16 BIT
  3131.     MOV    DMA_CX,AX        ;# OF BYTE/CYCLE (3445 FOR 44100 HZ)
  3132.     SHL    AX,2            ;4 TIMES FORWARD
  3133.     MOV    DMA_MORE,AX
  3134.     SHL    AX,2            ;8/16 TIMES MAXIMUM
  3135.     SHR    AX,CL            ;     (27560 FOR 44100 HZ)
  3136.     MOV    DMA_MAX,AX
  3137.     MOV    AX,DMA_OFFSET
  3138.     MOV    DMA_PTR,AX
  3139.     MOV    DMA_NEWPTR,AX
  3140.     MOV    AL,125
  3141.     CALL    Go_SetBPM
  3142.     MOV    BPM_COUNT,0
  3143.     MOV    MT_SPEED,6        ;DEFAULT PROTRACKER SPEED
  3144.     XOR    AX,AX
  3145.     MOV    SAM_CH,AL
  3146.     MOV    MT_COUNTER,AL        ;RESET PROTRACKER VARIABLES
  3147.     MOV    MT_PATTERNPOS,AX
  3148.     MOV    DL,SONG_START
  3149.     MOV    MT_SONGPOS,DL
  3150.     MOV    MT_PATTDELAYTIME2,AL
  3151.     MOV    MT_PATTDELAYTIME,AL
  3152.     MOV    MT_PBREAKFLAG,AL
  3153.     MOV    MT_PBREAKPOS,AL
  3154.     MOV    MT_POSJUMPFLAG,AL
  3155.     MOV    MT_LOWMASK,0FFH
  3156.     MOV    CX,47*8/2
  3157.     CLD
  3158.     PUSH    DS
  3159.     POP    ES
  3160.     MOV    DI,OFFSET NOTE
  3161.     REP STOSW
  3162.     INC    AL
  3163.     MOV    CX,MAX_CHAN_NUMB
  3164.     MOV    DI,OFFSET TONEPORTDIREC
  3165.     REP STOSB
  3166.     XOR    BX,BX
  3167. LPM2:    MOV    AL,[PAN_REGS+BX]
  3168.     MOV    [MPANNING+BX],AL
  3169.     INC    BX
  3170.     CMP    BX,MAX_CHAN_NUMB
  3171.     JB    LPM2
  3172.     CMP    DMA_CHANNEL,4        ;SET 8/16 BIT MIXING SMCODE
  3173.     JAE    SHORT GPM3
  3174.     MOV    AL,90H            ;NOP WITH 8 BIT
  3175.     MOV    BYTE PTR NOP1,AL
  3176.     MOV    BYTE PTR NOP2,AL
  3177.     MOV    BYTE PTR NOP3,AL
  3178.     MOV    BYTE PTR NOP4,AL
  3179.     MOV    BYTE PTR NOP5,AL
  3180.     MOV    BYTE PTR NOP6,AL
  3181.     MOV    AX,2588H        ;MOV [DI],AH
  3182.     MOV    WORD PTR MOVA1,AX
  3183.     MOV    WORD PTR MOVA2,AX
  3184.     MOV    WORD PTR MOVA3,AX
  3185.     MOV    AX,2500H        ;ADD [DI],AH
  3186.     MOV    WORD PTR ADDA2,AX
  3187.     MOV    WORD PTR ADDA3,AX
  3188.     MOV    AX,3D88H        ;MOV [DI],BH
  3189.     MOV    WORD PTR MOVB1,AX
  3190.     MOV    WORD PTR MOVB2,AX
  3191.     MOV    WORD PTR MOVB3,AX
  3192.     MOV    AX,3D00H        ;ADD [DI],BH
  3193.     MOV    WORD PTR ADDB2,AX
  3194.     MOV    WORD PTR ADDB3,AX
  3195.     JMP    SHORT GPM2
  3196. GPM3:    MOV    AL,47H            ;INC DI WITH 16 BIT (DEFAULT)
  3197.     MOV    BYTE PTR NOP1,AL
  3198.     MOV    BYTE PTR NOP2,AL
  3199.     MOV    BYTE PTR NOP3,AL
  3200.     MOV    BYTE PTR NOP4,AL
  3201.     MOV    BYTE PTR NOP5,AL
  3202.     MOV    BYTE PTR NOP6,AL
  3203.     MOV    AX,0589H        ;MOV [DI],AX
  3204.     MOV    WORD PTR MOVA1,AX
  3205.     MOV    WORD PTR MOVA2,AX
  3206.     MOV    WORD PTR MOVA3,AX
  3207.     MOV    AX,0501H        ;ADD [DI],AX
  3208.     MOV    WORD PTR ADDA2,AX
  3209.     MOV    WORD PTR ADDA3,AX
  3210.     MOV    AX,1D89H        ;MOV [DI],BX
  3211.     MOV    WORD PTR MOVB1,AX
  3212.     MOV    WORD PTR MOVB2,AX
  3213.     MOV    WORD PTR MOVB3,AX
  3214.     MOV    AX,1D01H        ;ADD [DI],BX
  3215.     MOV    WORD PTR ADDB2,AX
  3216.     MOV    WORD PTR ADDB3,AX
  3217. GPM2:    MOV    CX,3            ;PRECALCULATE SAMPLE DATA FOR INIT
  3218. LPM1:    PUSH    CX
  3219.     CALL    CONTROL_CHANNELS
  3220.     CALL    MIXUP_CHANNELS
  3221.     POP    CX
  3222.     LOOP    LPM1
  3223.     MOV    DX,DMA_SEG        ;INITIALIZE DMA
  3224.     MOV    BX,DMA_OFFSET
  3225.     MOV    CX,DMA_MAX
  3226.     CALL    DMA_INIT
  3227.     MOV    MOD_STAT,1        ;ACTIVATE IRQ-HANDLING
  3228.     CLC
  3229. GPM1:    RET
  3230. PLAY_MUSIC ENDP
  3231. ;-----------------------------------------------------------------------------
  3232. STOP_MUSIC PROC NEAR
  3233.     PUSH    CS
  3234.     POP    DS
  3235.     MOV    MOD_STAT,0
  3236.     CALL    DSP_RESET
  3237.     CALL    IRQ_INIT
  3238.     MOV    IRQCOUNT,56
  3239.     RET
  3240. STOP_MUSIC ENDP
  3241. ;-----------------------------------------------------------------------------
  3242. END_MUSIC PROC NEAR
  3243.     PUSH    CS
  3244.     POP    DS
  3245.     CMP    LOADMOD_FLAG,0
  3246.     JNE    SHORT GENM1
  3247.     CALL    FREE_TMEM
  3248. GENM1:    CALL    FREE_DMEM
  3249.     RET
  3250. END_MUSIC ENDP
  3251. ;-----------------------------------------------------------------------------
  3252. GET_SONGMOD PROC NEAR
  3253.     MOV    AL,CS:SB_MODUS
  3254.     RET
  3255. GET_SONGMOD ENDP
  3256. ;-----------------------------------------------------------------------------
  3257. SET_SONGMOD PROC NEAR
  3258.     AND    AL,3
  3259.     MOV    CS:SB_MODUS,AL
  3260.     CMP    CS:CD_MIXER,0
  3261.     JE    SHORT GSNG1
  3262.     PUSH    AX DX
  3263.     XOR    AH,AH
  3264.     TEST    AL,2
  3265.     JNZ    SHORT GSNG2
  3266.     MOV    AH,CS:MUSIC_VOL
  3267. GSNG2:    MOV    DX,CS:SBP_MIXERI
  3268.     MOV    AL,36H
  3269.     OUT    DX,AL
  3270.     INC    DX
  3271.     MOV    AL,AH            ;CD VOLUME L
  3272.     OUT    DX,AL
  3273.     DEC    DX
  3274.     MOV    AL,37H
  3275.     OUT    DX,AL
  3276.     INC    DX
  3277.     MOV    AL,AH            ;CD VOLUME R
  3278.     OUT    DX,AL
  3279.     DEC    DX
  3280.     MOV    AL,38H
  3281.     OUT    DX,AL
  3282.     INC    DX
  3283.     MOV    AL,AH            ;LINE IN VOLUME L
  3284.     OUT    DX,AL
  3285.     DEC    DX
  3286.     MOV    AL,39H
  3287.     OUT    DX,AL
  3288.     INC    DX
  3289.     MOV    AL,AH            ;LINE IN VOLUME R
  3290.     OUT    DX,AL
  3291.     POP    DX AX
  3292. GSNG1:    RET
  3293. SET_SONGMOD ENDP
  3294. ;-----------------------------------------------------------------------------
  3295. GET_SONGPOSITION PROC NEAR
  3296.     MOV    AL,CS:MT_SONGPOS
  3297.     RET
  3298. GET_SONGPOSITION ENDP
  3299. ;-----------------------------------------------------------------------------
  3300. SET_SONGPOSITION PROC NEAR
  3301.     PUSH    BX
  3302.     AND    AL,7FH
  3303.     MOV    CS:MT_SONGPOS,AL
  3304.     MOV    CS:MT_PATTERNPOS,0
  3305.     XOR    BX,BX
  3306. LSET1:    MOV    CS:[MSEG+BX],0
  3307.     INC    BL
  3308.     INC    BL
  3309.     CMP    BL,2*MAX_CHAN_NUMB
  3310.     JB    LSET1
  3311.     POP    BX
  3312.     RET
  3313. SET_SONGPOSITION ENDP
  3314. ;-----------------------------------------------------------------------------
  3315. SET_SONGLOOP PROC NEAR
  3316.     MOV    CS:SONG_LOOP,AL
  3317.     RET
  3318. SET_SONGLOOP ENDP
  3319. ;-----------------------------------------------------------------------------
  3320. GET_VOLUME PROC NEAR
  3321.     MOV    AL,CS:MASTER_VOLUME    ;0= MIN VOLUME, 255= MAX VOLUME
  3322.     MOV    BL,CS:MUSIC_VOLUME    ;0= MIN VOLUME, 255= MAX VOLUME
  3323.     MOV    BH,CS:FX_VOLUME        ;0= MIN VOLUME, 255= MAX VOLUME
  3324.     RET
  3325. GET_VOLUME ENDP
  3326. ;-----------------------------------------------------------------------------
  3327. SET_VOLUME PROC NEAR
  3328.     MOV    CS:MASTER_VOLUME,AL    ;0= MIN VOLUME, 255= MAX VOLUME
  3329.     MOV    CS:MUSIC_VOLUME,BL    ;0= MIN VOLUME, 255= MAX VOLUME
  3330.     MOV    CS:FX_VOLUME,BH        ;0= MIN VOLUME, 255= MAX VOLUME
  3331.     PUSH    AX DX
  3332.     MOVZX    DX,AL
  3333.     INC    DX
  3334.     PUSH    DX
  3335.     MOVZX    AX,BL
  3336.     MUL    DX
  3337.     MOV    CS:MUSIC_VOL,AH
  3338.     CMP    CS:CD_MIXER,0
  3339.     JE    SHORT GSTV1
  3340.     MOV    DX,CS:SBP_MIXERI
  3341.     MOV    AL,36H
  3342.     OUT    DX,AL
  3343.     INC    DX
  3344.     MOV    AL,AH            ;CD VOLUME L
  3345.     OUT    DX,AL
  3346.     DEC    DX
  3347.     MOV    AL,37H
  3348.     OUT    DX,AL
  3349.     INC    DX
  3350.     MOV    AL,AH            ;CD VOLUME R
  3351.     OUT    DX,AL
  3352.     DEC    DX
  3353.     MOV    AL,38H
  3354.     OUT    DX,AL
  3355.     INC    DX
  3356.     MOV    AL,AH            ;LINE IN VOLUME L
  3357.     OUT    DX,AL
  3358.     DEC    DX
  3359.     MOV    AL,39H
  3360.     OUT    DX,AL
  3361.     INC    DX
  3362.     MOV    AL,AH            ;LINE IN VOLUME R
  3363.     OUT    DX,AL
  3364. GSTV1:    POP    DX
  3365.     MOVZX    AX,BH
  3366.     MUL    DX
  3367.     MOV    CS:FX_VOL,AH
  3368.     POP    DX AX
  3369.     RET
  3370. SET_VOLUME ENDP
  3371. ;-----------------------------------------------------------------------------
  3372. SET_LOADMOD_FLAG PROC NEAR
  3373.     AND    AL,1
  3374.     MOV    CS:LOADMOD_FLAG,AL    ;0= NORMAL, 1= CD PLAYER MODUS
  3375.     RET
  3376. SET_LOADMOD_FLAG ENDP
  3377. ;-----------------------------------------------------------------------------
  3378. SET_SAMPLERATE PROC NEAR
  3379.     CMP    AX,10000
  3380.     JAE    SHORT GSSR1
  3381.     MOV    AX,10000
  3382. GSSR1:    CMP    AX,44100
  3383.     JBE    SHORT GSSR2
  3384.     MOV    AX,44100
  3385. GSSR2:    MOV    CS:SAMPLE_RATE,AX    ;BEST BETWEEN 22222 - 44100 Hz
  3386.     RET
  3387. SET_SAMPLERATE ENDP
  3388. ;-----------------------------------------------------------------------------
  3389. SET_IRQ_RATE PROC NEAR
  3390.     PUSH    CS
  3391.     POP    DS
  3392.     MOV    BPM_RATE,AX
  3393.     MOV    AX,BPM_VALUE
  3394.     CALL    Go_SetBPM
  3395.     RET
  3396. SET_IRQ_RATE ENDP
  3397. ;-----------------------------------------------------------------------------
  3398. ; STARTET SAMPLE AUSGABE
  3399. ; BX= SAMPLE-HANDLE, CX= SAMPLERATE, AL= PANNING: 0= LEFT, 255=RIGHT
  3400. ;-----------------------------------------------------------------------------
  3401. PLAY_SAMPLE PROC NEAR
  3402.     PUSH    CS
  3403.     POP    DS
  3404.     TEST    SB_MODUS,1
  3405.     JNZ    GPSMP1
  3406.     CMP    EMS_SEG,0
  3407.     JE    GPSMP1
  3408.     MOVZX    DI,SAM_CH
  3409.     SHL    DI,1
  3410.     XOR    AH,AH
  3411.     SHR    AL,4
  3412.     PUSH    AX
  3413.     MOV    AX,CX    
  3414.     SHL    EAX,16
  3415.     MOVZX    ECX,SAMPLE_RATE
  3416.     XOR    EDX,EDX
  3417.     DIV    ECX
  3418.     POP    DX
  3419.     OR    EAX,EAX
  3420.     JZ    SHORT GPSMP1
  3421.     CLI
  3422.     MOV    [SAM_PAN+DI],DX
  3423.     MOV    [SAM_FIX+DI],AX
  3424.     SHR    EAX,16
  3425.     MOV    [SAM_FRQ+DI],AX
  3426.     MOV    [SAM_OFL+DI],0
  3427.     MOV    AX,[SAMPLE_BIG+BX]
  3428.     MOV    [SAM_MAX+DI],AX
  3429.     MOV    AX,EMS_SEG
  3430.     MOV    [SAM_SEG+DI],AX
  3431.     MOVZX    EAX,[SAMPLE_MEM+BX]
  3432.     SHL    DI,1
  3433.     SHL    EAX,4
  3434.     MOV    [SAM_OFS+DI],EAX
  3435.     STI
  3436.     INC    SAM_CH
  3437.     CMP    SAM_CH,FX_CHAN_NUMB
  3438.     JB    SHORT GPSMP1
  3439.     MOV    SAM_CH,0
  3440. GPSMP1:    RET
  3441. PLAY_SAMPLE ENDP
  3442. ;-----------------------------------------------------------------------------
  3443. END_SAMPLE PROC NEAR
  3444.     PUSH    CS
  3445.     POP    DS
  3446.     XOR    BX,BX
  3447. LENDS1:    MOV    [SAM_SEG+BX],0
  3448.     INC    BX
  3449.     INC    BX
  3450.     CMP    BX,2*FX_CHAN_NUMB
  3451.     JB    LENDS1
  3452.     CMP    EMS_SEG,0
  3453.     JE    SHORT GEMP1
  3454.     MOV    AH,45H
  3455.     MOV    DX,EMS_HANDLE
  3456.     INT    67H
  3457.     MOV    EMS_SEG,0
  3458. GEMP1:    RET
  3459. END_SAMPLE ENDP
  3460. ;=============================================================================
  3461.  
  3462.  
  3463. IF COM_OR_OBJ
  3464. ;=============================================================================
  3465. MAIN_CONT PROC NEAR
  3466.     PUSH    BP DS CS ES
  3467.     POP    DS
  3468.     SHL    DI,2
  3469.     ADD    DI,0100H
  3470.     CALL    DI            ;FAR CALL
  3471.     SETC    DL
  3472.     XOR    DH,DH
  3473.     POP    DS BP            ;BP IS ABSOLUTELY IMPORTANT FOR C
  3474.     RETF
  3475. MAIN_CONT ENDP
  3476. ;=============================================================================
  3477.  
  3478. ELSE
  3479. ;=============================================================================
  3480. ;
  3481. ; MAIN ROUTINE
  3482. ;
  3483. ;=============================================================================
  3484. MAIN_CONT PROC NEAR
  3485.     MOV    AX,CS            ;DS setzen
  3486.     MOV    DS,AX
  3487.     MOV     PROG_START_SEG,ES       ;PROGRAMMANFANG
  3488.     MOV     AX,SS                   ;UND -ENDE MERKEN
  3489.     MOV     BX,OFFSET PROG_END
  3490.     ADD     BX,STACKLENGTH
  3491.     MOV     SP,BX
  3492.     SHR     BX,4
  3493.     INC     BX
  3494.     ADD     AX,BX
  3495.     MOV     PROG_END_SEG,AX
  3496.     XOR    BX,BX
  3497. GL1:    MOV    AL,ES:[82H+BX]
  3498.     OR    AL,AL
  3499.     JZ    SHORT GL2
  3500.     CMP    AL,20H
  3501.     JE    SHORT GL2
  3502.     CMP    AL,0DH
  3503.     JE    SHORT GL2
  3504.     MOV    [MOD_NAME+BX],AL
  3505.     INC    BX
  3506.     CMP    BX,40H
  3507.     JB    GL1
  3508. GL2:    OR    BX,BX
  3509.     JZ    GMEND
  3510.     XOR    AL,AL
  3511.     MOV    [MOD_NAME+BX],0
  3512.     CALL    FREE_MEM
  3513.     MOV    VAR_BUFSEG,0
  3514. ;-----------------------------------------------------------------------------
  3515. ; INITIALIZING & STARTING
  3516. ;    MOV    AX,44100        ;SET MAXIMUM SAMPLERATE
  3517. ;    CALL    SET_SAMPLERATE
  3518. ;    MOV    AL,255            ;SET MAXIMUM VOLUME
  3519. ;    MOV    BL,AL
  3520. ;    MOV    BH,AL
  3521. ;    CALL    SET_VOLUME
  3522.     CALL    CONFIG_INIT        ;GET CONFIG
  3523.     MOV    DX,OFFSET MOD_NAME    ;FIRST, TRY LOADING
  3524.     CALL    LOAD_MOD
  3525.     JNC    SHORT GM1
  3526.     MOV    AH,9
  3527.     MOV    DX,OFFSET ERROR1_TEXT
  3528.     INT    21H
  3529.     JMP    SHORT GM4
  3530. GM1:    MOV    DX,OFFSET SAMPLE_NAME    ;GET SAMPLE
  3531.     MOV    CL,80H            ;PC-SAMPLE
  3532.     CALL    LOAD_SAMPLE
  3533.     JNC    SHORT GM2
  3534.     MOV    AH,9
  3535.     MOV    DX,OFFSET ERROR2_TEXT
  3536.     INT    21H
  3537. GM2:    CALL    PLAY_MUSIC        ;TRY STARTING
  3538.     JNC    SHORT GM3
  3539.     MOV    AH,9
  3540.     MOV    DX,OFFSET ERROR3_TEXT
  3541.     INT    21H
  3542.     JMP    SHORT GM4
  3543. ;-----------------------------------------------------------------------------
  3544. ; THIS COULD BE THE MAIN ROUTINE
  3545. GM3:    MOV    AH,9
  3546.     MOV    DX,OFFSET OUT_TEXT
  3547.     INT    21H
  3548. LM1:    XOR    AH,AH
  3549.     INT    16H
  3550.     CMP    AL,27
  3551.     JE    SHORT GM5
  3552.     CMP    AL,"+"
  3553.     JNE    SHORT G1
  3554.     CALL    GET_VOLUME
  3555.     INC    AL
  3556.     CALL    SET_VOLUME
  3557.     JMP    LM1
  3558. G1:    CMP    AL,"-"
  3559.     JNE    SHORT G2
  3560.     CALL    GET_VOLUME
  3561.     DEC    AL
  3562.     CALL    SET_VOLUME
  3563.     JMP    LM1
  3564. G2:    CMP    AL,"9"
  3565.     JNE    SHORT G3
  3566.     MOV    AL,0
  3567.     CALL    SET_SONGLOOP
  3568.     JMP    LM1
  3569. G3:    CMP    AL,"0"
  3570.     JNE    SHORT G4
  3571.     INC    SB_MODUS
  3572.     MOV    AL,SB_MODUS
  3573.     CALL    SET_SONGMOD
  3574.     JMP    LM1
  3575. G4:    CMP    AL,"1"
  3576.     JNE    LM1
  3577.     ADD    PAN_FX,10H
  3578.     MOV    AL,PAN_FX        ;PANNING
  3579.     XOR    BX,BX            ;HANDLE
  3580.     MOV    CX,22050        ;FREQUENCE
  3581.     CALL    PLAY_SAMPLE
  3582.     JMP    LM1
  3583. ;-----------------------------------------------------------------------------
  3584. ; CUTTING OFF
  3585. GM5:    CALL    STOP_MUSIC        ;STOP MUSIC
  3586. GM4:    CALL    END_SAMPLE        ;UNLOAD SAMPLES
  3587.     CALL    END_MUSIC        ;UNLOAD MUSIC
  3588. GMEND:    MOV     AX,4C00H                ;BEENDEN NACH DOS
  3589.     INT     21H
  3590. MAIN_CONT ENDP
  3591. ;=============================================================================
  3592. ENDIF
  3593.  
  3594. ;=============================================================================
  3595. RASTER_COL PROC NEAR
  3596.     MOV    DX,03DAH
  3597.     IN    AL,DX
  3598.     MOV     DX,03C0H                ;OVERSCAN AENDERN        
  3599.     MOV     AL,31H                  ;REGISTER 11H
  3600.     OUT     DX,AL                   ;BILDSCHIRM AUS
  3601.     MOV     AL,AH                   ;WERT AH IN REGISTER (DAC-INDEX)
  3602.     OUT     DX,AL
  3603.     RET
  3604. RASTER_COL ENDP
  3605. ;=============================================================================
  3606. CODE_SEG2 ENDS
  3607.  
  3608. END _MAIN2